在Node.js中将参数从一个模块传递到另一个模块

时间:2018-02-27 14:55:31

标签: node.js express

我正在使用node.js中的REST API,并且在尝试将值从一个模块传递到另一个模块时遇到问题,我对node.js很新。我确实有一些东西在这里遗漏了一些东西...

我有一个控制器和一个用于身份验证的“服务”模块,它使用JWT。我要做的是将用户对象传递给auth服务以获取JWT并将其传递回控制器以构建响应。

在服务中我得到JWT没有问题,但我无法将其传回...... return param;在这种情况下不起作用。

这是我的控制器的功能

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

    Users.findOne({ 'email': email, 'password': password }, (err, user) => {
        if (err) {
            res.json({ err });
        } else {
            if (typeof user !== null) {                
                var token = authService.generateToken(user);
                res.json({
                    token
                });

            } else {
                res.json({
                    status: 'error',
                    message: 'User not found!'
                });
            }

        }
    })
};

这是我的authService(包含在控制器中)的函数

exports.generateToken = function(user) {
    jwt.sign({ user }, params.secret, { expiresIn: params.expires }, (err, token) => {
        if (err)
            return err;
        console.log(token);
        return token;
    });
}

现在来自console.log(token)的{​​{1}}会在控制台中返回有效的JWT,但在authService中我什么都没有回来。

有人可以帮帮我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

你不能通过异步回调return。您必须提供回调函数以将值传递给:

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

  Users.findOne({ email, password }, (err, user) => {
    if (err) {
      res.json({ err });
    } else {
      if (typeof user !== null) {                
        authService.generateToken(user, req, (err, token) => {
          res.json({
            token
          });
        });
      } else {
        res.json({
          status: 'error',
          message: 'User not found!'
        });
      }
    }
  });
};

exports.generateToken = function(user, req, callback) {
  jwt.sign({ user }, req.params.secret, { expiresIn: req.params.expires }, callback);
}

或者,您可以将回调转换为promises,使您的异步流程稍微变平:

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

  Users.findOne({ email, password }).then(user => {
    if (user === null) throw new Error('User not found');
    return authService.generateToken(user, req);
  }).then(token => {
    res.json({ token });
  }).catch(error => {
    res.json({ status: 'error', message: error.message });
  });
};

exports.generateToken = (user, req) => new Promise((resolve, reject) => {
  jwt.sign({ user }, req.params.secret, { expiresIn: req.params.expires }, (error, token) => {
    if (error) reject(error);
    else resolve(token);
  });
});

最后,如上所述离开exports.generateToken(),您可以将基于承诺的exports.login()转换为async函数:

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

  try {
    const user = await Users.findOne({ email, password });

    if (user === null) throw new Error('User not found');

    const token = await authService.generateToken(user, req);

    res.json({ token });
  } catch (error) {
    res.json({ status: 'error', message: error.message });
  }
};