如何通过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) }}