如何通过 API 获得用户

How to get users via API

我的项目中有两个模型:申请人和公司。 创建、验证和删除用户是由同一个 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 函数一样)。见 example.

也当你这样做

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

如果找到用户,最后一行仍然会被执行。确保执行 return next(); 或使用 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)
    }
};