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;
}
}