Javascript 如何通过API获取用户
在我的项目中有两种模式:申请者和公司。 创建、验证和删除用户是通过相同的API进行的。 所以,我有一个中间件,它通过会话ID解析用户模型。例如,它将用于获取当前用户,首先我们通过其ID接收用户,然后发送它。 我的代码如下:Javascript 如何通过API获取用户,javascript,node.js,express,asynchronous,async.js,Javascript,Node.js,Express,Asynchronous,Async.js,在我的项目中有两种模式:申请者和公司。 创建、验证和删除用户是通过相同的API进行的。 所以,我有一个中间件,它通过会话ID解析用户模型。例如,它将用于获取当前用户,首先我们通过其ID接收用户,然后发送它。 我的代码如下: getUserByID(req, res, next) { if (req.session.user_id) { async.race([ (callback) => { Applicant.findOne({_id: req.session.u
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
next()
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
我对这条路线进行了测试,问题是测试随机通过,而不是随机通过。我想这是因为我使用了模块异步,或者smthg
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
return next(); // added return statement
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
最终回调的第一个参数是错误对象(与大多数
async.js
函数类似)。看
当你这样做的时候
if (user) {
res.locals.currentUser = user;
next();
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400); // *
如果找到用户,最后一行仍将执行。确保执行returnnext()代码>或使用if/else
我将重构您的代码,如下所示。async.js
的美妙之处在于,您可以将错误处理整合到一个地方
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
callback => Applicant.findById(req.session.user_id, callback),
callback => Company.findById(req.session.user_id, callback)
],
(err, user) => {
// note the use of return to prevent execution of any following lines
if (err)
return apiHelper.handleError(res, 'Unknown error', 'Can not find user', 500);
if (!user)
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400);
res.locals.currentUser = user;
next();
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}
};
使用async.race()
的原因是什么?用户是申请人还是公司?