Javascript 如何在注册用户之前检查用户凭据,同时将图像上载到aws s3

Javascript 如何在注册用户之前检查用户凭据,同时将图像上载到aws s3,javascript,node.js,amazon-web-services,express,amazon-s3,Javascript,Node.js,Amazon Web Services,Express,Amazon S3,我正在尝试在我的应用程序中实现注册路由。流程非常简单。在使用应用程序时,用户有机会选择配置文件图像(但他不必这样做)。稍后,要求用户注册并输入电子邮件 现在,我想检查我的注册路线,如果电子邮件已经存在,然后再上传图像到我的S3存储桶。如果它确实存在,我想发回一条正确的错误消息。如果它不存在,我想检查用户是否发送了一个图像,并继续将图像上载到S3,以便我可以将链接存储在我的数据库中,并继续注册用户 问题 我将文件和电子邮件都附加到formData对象中,就像这样。此时,文件可以为空。这取决于用户是

我正在尝试在我的应用程序中实现注册路由。流程非常简单。在使用应用程序时,用户有机会选择配置文件图像(但他不必这样做)。稍后,要求用户注册并输入电子邮件

现在,我想检查我的注册路线,如果电子邮件已经存在,然后再上传图像到我的S3存储桶。如果它确实存在,我想发回一条正确的错误消息。如果它不存在,我想检查用户是否发送了一个图像,并继续将图像上载到S3,以便我可以将链接存储在我的数据库中,并继续注册用户

问题

我将文件和电子邮件都附加到formData对象中,就像这样。此时,
文件可以为空。这取决于用户是否选择了配置文件图像

const formData = new FormData();
formData.append('avatar', this.variables.avatar);
formData.append('email', JSON.stringify(this.email));
问题是在发出请求时,
req.file
未定义,或者
req.body.email
未定义。原因很简单,在图像上传到s3存储桶之前,我无法访问
req.body.email
。这意味着,每次用户注册已有的电子邮件时,图像都会被发送到我的s3存储桶

这是我上传到aws的功能:

const avatarImgUpload = multer({
  storage: multerS3({
    s3: s3,
    bucket: process.env.AWS_BUCKET,
    acl: 'public-read',
    key: function (req, file, cb) {
      cb(null, path.basename(file.originalname, path.extname(file.originalname)) + '-' + Date.now() + path.extname(file.originalname))
    }
  }),
}).single('avatar');
这是我的注册路线:

router.post('/register', (req, res) => {
  //let email = JSON.parse(req.body.email);
  //The email is undefined because I am not using middleware 
  //like multer to be able to 'read' or 'acces' this

  //Ideally I would like to FIRST check if a user exists like so:
  //User.findOne({email: req.body.email})

  //If it does not exists, great! Continue to the 'avatarImgUpload' function that uploads to S3'
  //If not, send back an error message and end the request there.

  avatarImgUpload(req, res, (error) => {
    //Within this function I do have access to req.body.email because it uses multer.
    //However, like I said before this means that the check IF the user already exists
    //has to take place AFTER the image is uploaded to my S3 bucket, which isn't great.
  })
})

有办法解决这个问题吗?在将图像上传到S3存储桶之前,我是否可以访问
req.body.email
?例如,有没有一种方法可以同时发送
formData
对象和
JSON
,这样我就可以在继续上传文件之前先检查电子邮件?

只需将其拆分为两个请求,让用户认为使用AJAX只需要一个操作:

  • 检查用户条件
  • 如果匹配,允许注册和上载
  • 为了更安全,预先签名的Url工作得很好。签名的url就像一个临时链接,具有用于上传到S3的临时权限,没有此链接,用户无法上传到S3。基本上,流程是:

  • 用户请求服务器检查条件并获取签名的url->如果匹配,则使用url进行服务器响应
  • 不确定multer是否支持获取签名url,此代码正在使用aws sdk:

    router.post('/register', (req, res) => {
      // Check User exists
      // ...
    
      // Set custom info for the uploading image
      const fileName = uuid();
      const s3 = new S3();
      const params = {
        Bucket: 'bucket name',
        Key: 'file name',
        ContentType: 'image/*',
        Expires: 60 * 10, // Url is available for 10 mins
        Metadata: {
          'email': 'user@example.com',
          'custom-field': 'custom data',
        },
      };
    
      res.send(await s3.getSignedUrl('putObject', params));
    });
    
  • 用户使用url上传到S3
  • 更多信息:


    您是否使用了一些身份验证方法?您的意思是什么@我的意思是你如何授权用户?我可以使用jwt作为jwt令牌@MykhayloSo在JWT令牌中包含来自DB模型的一些字段,这些字段表示用户是否有照片,因此在身份验证中,您将知道用户是否有照片,不要忘记在字段更改时更新访问令牌。这就是我的目的。我不喜欢把它分成两个请求,因为它看起来很丑。但如果成功了,我想是的,呵呵。感谢您分享您的意见:)。发送两个请求没有什么错,在ajax:D出现之前,网络世界更加丑陋,用户不会以我们的方式看待它。嗯,希望有帮助:)