我具有应该用于验证用户身份并返回WT令牌的功能:
async function authenticate({username, password}) {
userModel.find({username: username, password: password}, (err, doc) => {
if (doc[0]) {
const user = {
id: doc[0]._id,
username: doc[0].username,
password: doc[0].password,
firstName: doc[0].firstName,
lastName: doc[0].lastName,
role: doc[0].role
};
const token = jwt.sign({sub: user.id, role: user.role}, config.secret);
const {password, ...userWithoutPassword} = user;
return {
...userWithoutPassword,
token
};
}
});
}
userModel是猫鼬模型。最后的return语句似乎不返回任何内容,而是在其中执行console.log,正确填充了值。我想念什么吗?我是第一次尝试使用node,因此如果不清楚,请询问。
我签出了以前建议的解决方案,但是我不知道如何将其应用于我的具体情况。
答案 0 :(得分:0)
将用户模型包装在Promise中,然后就可以等待它
async function authenticate({ username, password }) {
return await new Promise(function(resolve) {
userModel.find({ username: username, password: password }, (err, doc) => {
if (doc[0]) {
const user = {
id: doc[0]._id,
username: doc[0].username,
password: doc[0].password,
firstName: doc[0].firstName,
lastName: doc[0].lastName,
role: doc[0].role
};
const token = jwt.sign(
{ sub: user.id, role: user.role },
config.secret
);
const { password, ...userWithoutPassword } = user;
resolve({
...userWithoutPassword,
token
});
}
});
});
}
答案 1 :(得分:0)
您需要使用async和await而不是使用回调:-
async function authenticate({username, password}) {
try {
const doc = await userModel.findOne({username: username, password: password});
if (doc) {
const user = {
id: doc._id,
username: doc.username,
password: doc.password,
firstName: doc.firstName,
lastName: doc.lastName,
role: doc.role
};
const token = jwt.sign({sub: user.id, role: user.role}, config.secret);
const {password, ...userWithoutPassword} = user;
return {
...userWithoutPassword,
token
};
}
} catch(err) {
// handle error
}
}
答案 2 :(得分:0)
猫鼬5.0在默认情况下会使用本地承诺, 否则没有承诺。您仍然可以设置自定义承诺 库使用mongoose.Promise = require('bluebird');但是, mpromise将不受支持。
async function authenticate({ username, password }) {
let doc = await userModel.find({ username: username, password: password }).exec(); // exec() convert query to a native Promise.
if (doc[0]) {
const user = {
id: doc[0]._id,
username: doc[0].username,
password: doc[0].password,
firstName: doc[0].firstName,
lastName: doc[0].lastName,
role: doc[0].role
};
const token = jwt.sign({ sub: user.id, role: user.role }, config.secret);
const { password, ...userWithoutPassword } = user;
return {
...userWithoutPassword,
token
};
}
// else ?
return null;
}