我想被告知关于一个用户的登录状态。例如,如果用户尝试使用数据库中的现有电子邮件注册,我希望获得返回值STATUS_DUPLICATE_EMAIL
(字符串)。另一种可能性是,如果用户试图使用以前登录的社交媒体帐户使用电子邮件登录,我希望获得返回值STATUS_SNS_EMAIL
。
代码片段:
app.post("/api/signup", (req, res) => {
const status = checkEmail(req, res);
// some sign up logic...
}
...
checkEmail = (req, res) => {
Database.findOne({
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}
return STATUS_DUPLICATE_EMAIL;
}
当我尝试console.log
status
时,它是undefined
,我不知道为什么会这样。从checkEmail
这样的函数中获得返回值的一般方法是什么?
status
的值是checkEmail()
函数返回的值-目前为空。
你应该做的是返回你的承诺(Database.findOne)从你的checkEmail
.
现在状态的值将是你返回的承诺。
现在你应该再次调用它的方法then
来获取值。
承诺被解决,但Javascript引擎读取你的代码之前。因此,promise的方法then
也会返回一个promise。
app.post("/api/signup", (req, res) => {
checkEmail(req, res).then(desired_value => {
const status = desired_value;
}
}
...
checkEmail = (req, res) => {
return Database.findOne({
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}
return STATUS_DUPLICATE_EMAIL;
}
}
或者
可以使用async/await
模式。当将一个函数声明为async
时,你可以在它的承诺前面加上await
,这将阻止代码的执行,直到它被解决。
app.post("/api/signup", async (req, res) => {
const status = await checkEmail(req, res);
}
...
checkEmail = (req, res) => {
return Database.findOne({
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}
return STATUS_DUPLICATE_EMAIL;
}
}
您应该返回Database.findOne()
。
同样使用async await
来得到checkMail()
的结果。
app.post("/api/signup", async (req, res) => {
const status = await checkEmail(req, res);
// some sign up logic...
}
...
app.post("/api/signup", (req, res) => {
const status = checkEmail(req, res);
// some sign up logic...
}
...
checkEmail = (req, res) => {
return Database.findOne({
where: {
email: req.body.email
}
}).then((user) => {
if (user) {
res.status(400).send({ message: "Email already used." });
}
return STATUS_DUPLICATE_EMAIL;
}
}