如何通过API获取用户

我的项目有两种模式:申请人和公司。 创build,authentication和删除用户发生在相同的API。 所以,我有一个中间件,通过会话ID来parsing用户模型。 例如,它将用于获取当前用户,首先我们通过其ID接收用户,然后发送它。 我的代码如下:

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

我对这条路线进行了testing,问题是testing随机通过,随机不通过。 我认为这是因为我使用模块asynchronous,或与它smthg

最后一个callback的第一个参数是一个错误对象(就像大多数async.js函数一样)。 看例子 。

另外当你这样做

 if (user) { res.locals.currentUser = user; next(); } return apiHelper.handleError(res, 'User not found', 'Can not log in', 400); // * 

如果find用户,最后一行仍然会被执行。 请确保return next(); 或使用if/else

我会重构你的代码如下。 async.js的美妙之处在于你可以在一个地方整合你的error handling。

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

尝试这个

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