简体   繁体   中英

How to make a function call wait in nodejs

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

I want to send the returned value of saveUserAccessDetails function as a response of login api but it's returning undefined as it's getting execute before saveUserAccessDetails function returns a value,Actually fuctinality is executing asychronusly however i just made it sychronous but its not working as expected. please guide the changes.

You need to convert saveUserAccessDetails to async function like this:

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

Inside the function do all the logic and return the data from MongoDB database.

Inside the login function, Change to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM