【发布时间】: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 函数返回一个已解决的承诺
-
避免
Promiseconstructor antipattern 中的login!当然,saveUserAccessDetails中的findOneAndUpdate和save方法也有返回承诺的版本,所以请使用它们。
标签: javascript node.js function asynchronous call