我正在使用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
中我什么都没有回来。
有人可以帮帮我吗?
谢谢!
答案 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 });
}
};