【问题标题】:How to make a function call wait in nodejs如何在nodejs中使函数调用等待
【发布时间】:2021-03-29 21:17:12
【问题描述】:
        async function login (req, res, next)  {
        return new Promise(function (resolve, reject) {
        var username = req.body.userName;
        var password = req.body.password;
        var otp = req.body.otp;
        var event = req.body.event;
        var Id = req.body.ObjId;
        var role = req.body.role;
        let data1 = {};
        UserModel.findOne({ username: username, status: "Active" }).then(data => {
            if (data && pwdhash.verify(password, data['password'])) {
             UserTokenModel.findOne({ UserId: data._id, Status: "Active", AccessToken: otp }).then(usertokenDoc => {
                    var currentTime = new Date();
                    var tokenCreationTime = usertokenDoc.Date.toUTCString();
                    var tokenCreationTimeUtc = new Date(tokenCreationTime + UTC");
                    var difference = currentTime - tokenCreationTimeUtc;
                    if (difference < 0) {
                        difference = 0;
                    }
                    var diffMinutes = Math.floor((difference / 1000) / 60);
                    if (diffMinutes > 3) {
         res.sendResponse(500, false, null, "OTP   timeout,regeneratethe OTP.");
                    } else {
                        let token = jwt.sign({ username: data['username'], user_id: data['_id'] }, config.secret, { expiresIn: config.tokenExpiry });
                        data1.email = data.email;
                        data1.token = token;
                        data1.username = data.username;
                        data1.status = data.status;
                        data1.role = data.role;
                        data1.application = data.application;
                        var ObjId =   saveUserAccessDetails(req, role, username, event, Id);
                        resolve('Authentication Successful...' + ObjId);
                        res.sendResponse(200, true, data1, 'Authentication  Successful...'+ObjId);
                    }
                }).catch(err => {
                    reject("OTP hasn't generated for this user.");
                    res.sendResponse(500, false, null, "OTP hasn't generated for this user.");
                })
            } else {
                reject('Incorrect Username or password');
                res.sendResponse(403, false, null, 'Incorrect Username or     password');
            }
        }).catch(err => {
            reject(err);
            res.sendResponse(500, false, null, err.toString());
        })
      })
     
    function saveUserAccessDetails(req, role, name, event, Id) {
    return new Promise(function (resolve, reject) {        
       var channel = req.body.channel;
        var networkDetailsObj = req.body.networkDetails;
       
        var userAccessModel = new UserAccessLogModel({
            "user_name": name,
            "networkDetails": networkDetailsObj,
            "loggedIn_systemIp": req.body.loggedInSystemIp,
            "channel": req.body.channel,
            "loginTime": req.body.loginTime,
            "logoutTime": req.body.logoutTime,
            "name": name,
            "role": role,
            "Event_name": event
        });

        if (event == "Logout") {
            userAccessModel.findOneAndUpdate({
                _id: Id
            }, {
                $addToSet: {
                    logoutTime: logoutTime
                }
            }, {
                new: true
            },  function (err, accessDoc) {
                if (err) {
                    reject(err);
                } else {
                    resolve(accessDoc._id);
                }
            })
        } else {
            userAccessModel.save( function (err, logDoc) {
                if (err) {
                    console.log("error While saving access log" + err);
                    reject(err);
                } else {
                    console.log("Access log saved successfully..." + logDoc._id);
                    resolve(logDoc._id);
                }
            })
        }
    })
}

我想发送 saveUserAccessDetails 函数的返回值作为登录 api 的响应,但它返回未定义,因为它在 saveUserAccessDetails 函数返回值之前执行,实际上功能正在异步执行但是我只是让它同步但它不能作为预期的 。请指导更改。

【问题讨论】:

  • 那么,return 是一个值还是不是?如果是这样,您的代码等待,该值将存储在ObjId 中。请发布saveUserAccessDetails 的完整代码 - 很可能问题是它没有返回值(如果它是异步的)。
  • 使用异步等待,从 saveUserAccessDetails 函数返回一个已解决的承诺
  • 避免Promise constructor antipattern 中的login!当然,saveUserAccessDetails 中的 findOneAndUpdatesave 方法也有返回承诺的版本,所以请使用它们。

标签: javascript node.js function asynchronous call


【解决方案1】:

您需要像这样将saveUserAccessDetails 转换为异步函数:

 async function saveUserAccessDetails(req, role, name, event, Id) {
 }

在函数内部执行所有逻辑并从 MongoDB 数据库返回数据。

登录功能里面,改成:

async function login (req, res, next)  {
 ...
 var ObjId = await saveUserAccessDetails(req, role, username, event, Id);
 ...
}

【讨论】:

  • 谢谢,但我已经尝试过这个并得到以下错误 var ObjId = await saveUserAccessDetails(req, role, username, event, Id); ^^^^^ SyntaxError: await 仅在异步函数中有效
猜你喜欢
  • 2016-10-29
  • 2023-01-31
  • 1970-01-01
  • 2018-01-15
  • 2019-09-18
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多