首页 > 解决方案 > 如何处理从 API Web 服务 (ExpressJS) 检索的数据/json?

问题描述

我是 NodeJS 和 ExpressJS 的新手。我创建了一个处理登录帖子的 AuthController。

exports.login = async (req, res, next) => {
try {
    const email = req.body.email;
    const password = req.body.password;

    const user = await User.findOne({ email }).select("+password");
    if (!user) {
        const error = new Error("Wrong Credentials");
        error.statusCode = 401;
        throw error;            
    }

    const validPassword = await user.validPassword(password);
    if (!validPassword) {
        const error = new Error("Wrong Credentials");
        error.statusCode = 401;
        throw error;      
    }

    const token = jwt.encode({id: user.id}, config.jwtSecret);
    res.send({user, token});
} catch(err) {
    next(err);
}
}

我想在我的 Web 应用程序中使用此方法让用户登录。如果用户成功登录,我会在浏览器中收到包含用户和令牌的 json 响应。那不是我想要的。api 登录的 url 是:/api/auth/login。我在我的 Web 应用程序中创建了一个函数:

router.post('/login', async (req, res, next) => {
    var apiResponse = await authController.login(req, res, next);
    res.render('profile.ejs', {user: apiResponse.user});
});

我不断收到 authController.login 不是函数的错误。我的问题是如何使用我的 API 中的方法并在我的 web 应用程序中使用响应?有人可以帮我吗?

标签: node.jsexpress

解决方案


您可以像下面的代码一样执行此操作:

router.post('/login', authController.login, async (req, res, next) => {
    res.render('profile.ejs', {user: apiResponse.user});
});

‍请阅读有关Express Middleware的文档。

更新:中间件

确保您的 authController 如下所示:

exports.login = async (req, res, next) => {
  try {
      const email = req.body.email;
      const password = req.body.password;

      const user = await User.findOne({ email }).select("+password");
      if (!user) {
          const error = new Error("Wrong Credentials");
          error.statusCode = 401;
          throw error;            
      }

      const validPassword = await user.validPassword(password);
      if (!validPassword) {
          const error = new Error("Wrong Credentials");
          error.statusCode = 401;
          throw error;      
      }

      const token = jwt.encode({id: user.id}, config.jwtSecret);
      // passing your data to next function
      // you can change exampleData with the 'variable' you want
      req.exampleData = { user, token }
      next();
  } catch(err) {
      next(err);
  }
}

如果您的 authController 与您的路由相同的根目录(“文件夹”),则使其看起来像这样:

const { login } = require('./authController');

所以,现在,你可以像这样调用 authController:

router.post('/login', login, async (req, res, next) => {
  // your data: "user" and "token" from middleware
  const { exampleData } = req;
  console.log(exampleData);
  res.render('profile.ejs', {user: exampleData});
});

我希望它可以帮助你。


推荐阅读