Javascript 如何通过API获取用户

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

在我的项目中有两种模式:申请者和公司。 创建、验证和删除用户是通过相同的API进行的。 所以,我有一个中间件,它通过会话ID解析用户模型。例如,它将用于获取当前用户,首先我们通过其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)
}}
我对这条路线进行了测试,问题是测试随机通过,而不是随机通过。我想这是因为我使用了模块异步,或者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()
的原因是什么?用户是申请人还是公司?