【问题标题】:return outter variable from callback is not work从回调返回外部变量不起作用
【发布时间】:2019-12-28 13:18:15
【问题描述】:

我需要从 userService.signIn() 返回具有新状态的结果 但回报依旧{ httpStatus: 500, message: undefined, errorMessage: undefined }

如何获得当前结果?

{
  httpStatus: 200,
  message: {
    auth: true,
    token,
    message: 'user found & logged in' 
  }
}
// user-service.js

module.exports = (db) => {
  return {
    signIn: function (req, res, next) {
      const result = { httpStatus: 500, message: undefined, errorMessage: undefined };
      passport.authenticate('local-comparePassword', {}, (err, user, info) => {
        if (err) {
          console.error(err);
        }
        if (info !== undefined) {
          console.error(`Info Message Error: ${info.message}`);
          if (info.message !== 'Username or Password is incorrect') {
            console.log(info.message)
            result.httpStatus = 401;
            result.errorMessage = info.message;
          } else if (!user) {
            console.log(info.message)
            result.httpStatus = 204;
            result.message = 'User not found';
          } else {
            console.log(info.message)
            result.httpStatus = 400;
            result.errorMessage = info.message;
          }
        } else {
          const token = jwt.sign(
            { id: user.id, role: user.role, name: user.name },
            jwtOptions.secretOrKey,
            { expiresIn: 3600 }
          );

          result.httpStatus = 200;
          result.message = {
            auth: true,
            token,
            message: 'user found & logged in'
          };
        }
        return result;
      })(req, res, next);

      // return result
    },
  }
}
// user-controller.js
module.exports = (db) => {
  return {
    signIn: async (req, res, next) => {
      try {
        const result = await userService(db).signIn(req, res, next)
        console.log('result', result) **// result undefined**
        if (res.httpStatus === 200 || result.httpStatus === 400 || result.httpStatus === 401) {
          res.status(result.httpStatus).json({ message: result.message });
        } else {
          res.status(result.httpStatus).json({ errorMessage: 'error' });
        }
      } catch (ex) {
        console.log(ex.message);
        res.status(400).json({ errorMessage: ex.message })
      }
    }
  }
}

【问题讨论】:

    标签: node.js express callback functional-programming passport.js


    【解决方案1】:

    没有运行您的代码,但在我看来:

    1. 为什么您在userService().signIn() 中注释掉了return result?因此// result undefined。好的,假设您的代码与您的问题有点不同步。
    2. 但是,如果您愿意 return result 来自 userService().signIn()(如您所愿),那将是徒劳的 - passport.authenticate() 异步调用您的回调 userService().signIn() 返回
    3. 在passport.authenticate() 回调中的return result 会将结果返回到passport.authenticate(),而不是返回到您的userService().signIn(),而且它会再次发生 signIn 返回
    4. 您必须将signIn 声明为async function(...) - 在await 中使用不返回Promise 的函数是没有意义的
    5. 为此,您还需要将passport.authenticate() 本身转换为异步函数。像这样的东西:
      new Promise((resolve, reject) => {
          passport.authenticate(..., (err, user, info) => {
              // ...
              if (err) reject(err);
              if (user) resolve(user);
          }
      }
      
    6. 然后你可以
      signIn: async function(req, res, next) {
        const result = { httpStatus: 500, message: undefined, errorMessage: undefined }
        return await new Promise((resolve, reject) => {
          passport.authenticate(..., (err, user, info) => {
            // ...
            resolve(result);
          }
        }
      }
      
      进而
      await userService(db).signIn()
      

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多