我一直都是前端人员。 Latley,我一直在使用Node.js和Mongoose开发后端。当用户注册时,我想创建一个用户(用户数据库),创建一个电子邮件令牌(emailToken数据库),然后以一种方法发送电子邮件...我什至不确定这是否是正确的方法它。
我一直很难尝试表达这一点,所以请原谅我的脑筋。我的问题是基于在调用该端点时返回状态。据我所知,只能返回一种状态,那么200在这里实际上意味着什么?在我的代码中,这意味着三件事都成功了吗?我觉得这种方法是错误的。在创建用户的情况下可能会出现这种情况,但是该函数的其余部分将失败……返回400或类似值。那也不理想。从逻辑上讲,我想返回200(用于创建用户),然后返回200(用于创建电子邮件令牌),以及200(用于成功发送电子邮件)。
我将不胜感激。
const user = new User(req.body);
user
.save()
.then(user => {
const emailToken = new EmailToken({
_userId: user._id,
token: crypto.randomBytes(16).toString("hex")
});
emailToken
.save()
.then(token => {
const transporter = nodemailer.createTransport({
service: "Sendgrid",
auth: {
user: USERNAME,
pass: PASSWORD
}
});
const mailOptions = {
from: "[email protected]",
to: user.email,
subject: "Account Verification Token",
text:
"Hello,\n\n" +
"Please verify your account by clicking the link: \nhttp://" +
req.headers.host +
"/verify/" +
token.token +
".\n"
};
transporter.sendMail(mailOptions, (err, info) => {
if (err) {
return res.status(409).send({
user,
error: "Could not send verification email. " + err.message
});
}
res.status(200).send({
user,
token: token.token,
success:
"A verification email has been sent to " + user.email + "."
});
});
})
.catch(error => {
res.status(409).send({
user,
message: "Could not send verification email."
});
});
})
.catch(error => {
if (error.name === "MongoError" && error.code === 11000) {
return res.status(400).send({
success: false,
message: "Username or email already exists."
});
}
res.status(400).send(error);
});
});
200这里实际意味着什么?
这意味着用户创建,令牌生成和发送邮件成功。
我觉得这种方法是错误的。创建用户时可能会出现这种情况,但其余功能将失败。
您可以在电子邮件失败时删除用户
[我感觉我想返回200用于创建用户,然后返回200用于创建电子邮件令牌,以及200用于成功发送电子邮件。
您只能发送一次响应,除非它是流。
您可以将您的Promise改写成这样的东西,以提高可读性并防止回调地狱。您可以检查“承诺做点” here
const nodemailer_credentials = {
service: "Sendgrid",
auth: {
user: USERNAME,
pass: PASSWORD
}
};
const user = new User(req.body);
let _token, _user;
user
.save()
.then(user => {
_user = user;
return new EmailToken({
_userId: user._id,
token: crypto.randomBytes(16).toString("hex")
}).save();
})
.then(token => {
_token = token;
return nodemailer.createTransport(nodemailer_credentials);
})
.then(transporter => {
return transporter.sendMail(mailOptions, (err, info) => {
if (err) {
const mailError = new Error('MailerError');
mailError.details = `Could not send verification email. ${err.message}`
throw(mailError);
}
return;
});
})
.then(() => {
res
.status(200)
.send({
user: _user,
token: _token.token,
success: `A verification email has been sent to ${user.email}.`
})
})
.catch(error => {
if (error.message === 'MailerError') {
return res.status(400).send({
user: _user,
message: error.details
});
}
if (error.name === 'MongoError' && error.code === 11000) {
return res.status(400).send({
success: false,
message: `Username or email already exists.`
});
}
res.status(400).send(error);
});