0
        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.

Or Assayag
  • 5,662
  • 13
  • 57
  • 93
Swapna
  • 63
  • 4
  • So, does it `return` a value or does it not? If it does, your code *will* wait and the value will get stored in `ObjId`. Please post the whole code of `saveUserAccessDetails` - most likely the problem is that it doesn't return a value (if it is asynchronous). – Bergi Dec 19 '20 at 13:26
  • Use async await, return a resolved promise from saveUserAccessDetails function – Pranjal Koshti Dec 19 '20 at 13:52
  • Avoid the [`Promise` constructor antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it) in `login`! And certainly the `findOneAndUpdate` and `save` methods in `saveUserAccessDetails` do have promise-returning versions as well, so use those. – Bergi Dec 19 '20 at 20:38

1 Answers1

0

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);
 ...
}
Or Assayag
  • 5,662
  • 13
  • 57
  • 93
  • 1
    Thanks but i already tried with this and got the below error var ObjId = await saveUserAccessDetails(req, role, username, event, Id); ^^^^^ SyntaxError: await is only valid in async function – Swapna Dec 20 '20 at 14:39