return 来自回调的外部变量不起作用

return outter variable from callback is not work

我需要 return 来自 userService.signIn() 的新状态 但是 return 仍然 { 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 })
      }
    }
  }
}

没有运行你的代码,但正如我所见:

  1. 为什么您在 userService().signIn() 中注释掉了 return result?因此 // result undefined。好的,假设您的代码与您的问题有点不同步。
  2. 但是,如果您的意愿 return result 来自 userService().signIn()(如您所愿),那将不会白费 - passport.authenticate() 异步调用您的回调 after userService().signIn() returns
  3. return result 内部 passport.authenticate() 回调将 return 结果为 passport.authenticate(),而不是你的 userService().signIn(),而且,它会在signInreturns
  4. 之后发生
  5. 您必须将 signIn 声明为 async function(...) - await 中没有 return 一个 Promise[=41 的函数是没有意义的=]
  6. 为此,您还需要将 passport.authenticate() 本身转换为异步函数。是这样的:
    new Promise((resolve, reject) => {
        passport.authenticate(..., (err, user, info) => {
            // ...
            if (err) reject(err);
            if (user) resolve(user);
        }
    }
    
  7. 然后你可以
    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()