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