Node.js 包含承诺的函数的返回值

Node.js 包含承诺的函数的返回值,node.js,Node.js,我想知道用户的登录状态。例如,如果用户试图使用数据库中的现有电子邮件进行注册,我希望获得STATUS\u DUPLICATE\u email(字符串)的返回值。另一种可能性是,如果用户试图使用以前登录的社交媒体帐户登录电子邮件,我希望获得STATUS\u SNS\u email的返回值 代码段: app.post("/api/signup", (req, res) => { const status = checkEmail(req, res); // so

我想知道用户的登录状态。例如,如果用户试图使用数据库中的现有电子邮件进行注册,我希望获得
STATUS\u DUPLICATE\u email
(字符串)的返回值。另一种可能性是,如果用户试图使用以前登录的社交媒体帐户登录电子邮件,我希望获得
STATUS\u SNS\u 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
时,它是
未定义的
,我不确定为什么会这样。从函数(如
checkEmail
)获取返回值的一般方法是什么?

您应该返回
Database.findOne()

还可以使用
async wait
获取
checkMail()的结果


status
的值是函数
checkEmail()
返回的值-当前为空。
您应该做的是从
检查电子邮件中返回您的承诺(Database.findOne)

现在,状态的价值将是您返回的承诺。
现在您应该调用它的方法
,然后再次调用
来获取值

承诺已得到解决,但Javascript引擎会在解决之前读取您的代码。因此,允诺的方法
然后
也会返回允诺

app.post(“/api/signup)”,(请求、回复)=>{
检查电子邮件(请求、回复)。然后(期望值=>{
const status=所需的_值;
}
}
...
检查电子邮件=(请求、回复)=>{
返回Database.findOne({
其中:{
电子邮件:req.body.email
}
})。然后((用户)=>{
如果(用户){
res.status(400).send({消息:“电子邮件已被使用。”});
}
返回状态\u重复\u电子邮件;
}
}
或者 您可以使用
async/await
模式。当将函数声明为
async
时,您可以在函数中添加
await
前缀,这将阻止代码执行,直到解决问题

app.post(“/api/signup”),异步(req,res)=>{
const status=等待检查电子邮件(请求、回复);
}
...
检查电子邮件=(请求、回复)=>{
返回Database.findOne({
其中:{
电子邮件:req.body.email
}
})。然后((用户)=>{
如果(用户){
res.status(400).send({消息:“电子邮件已被使用。”});
}
返回状态\u重复\u电子邮件;
}
}

处理它的唯一好方法是使用
async Wait
这似乎有效,你知道这背后的原理是什么吗?我知道这样做会返回一个承诺,但我不是已经在“等待”数据库承诺在返回值之前解决吗?刚刚更新,使用async Wait获得checkMailAh的结果,“status的值是checkEmail()函数返回的值-当前为空。”!这一行非常有用,谢谢!
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;
   }
}