【问题标题】:How to get users via API如何通过 API 获取用户
【发布时间】:2018-02-12 13:10:21
【问题描述】:

我的项目中有两种模式:申请人和公司。 创建、验证和删除用户由同一个 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 使用它

【问题讨论】:

  • 您使用async.race()的原因是什么?用户是申请人还是公司?

标签: javascript node.js express asynchronous async.js


【解决方案1】:

最终回调的第一个参数是一个错误对象(就像大多数 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)
    }
};

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2019-03-28
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多