我正在使用一个逻辑来从一个名为“Group”的实体中获取 ID,我需要从另一个名为 User 的实体中设置一个具有此值的变量。
我创建了一个函数,在 mongo 中搜索名为“admin”的文档并返回他的 id。我认为问题在于该函数是异步的,所以,我稍后才得到这个值。
这就是我想做的:
function getAdminId() {
Group.findOne(
{
name: "admin"
},
function(err, admin){
if(err){
console.log("Erro ao pegar o ID do admin");
}else{
return admin._id;
}
}
)
};
该函数将创建用户,但传递 ID 值
exports.register = function(req, res, next) {
// Verifica se a chave digitada existe no banco de dados.
if (req.company) {
var user = new User(req.body);
var message = null;
user.provider = "local";
user.username = usernameGenerator.generateUsername("-");
user.password = generator.generate({
length: 8,
numbers: true
});
user.name = "admin";
// Pegar o id do grupo de admin
user.groupid = getAdminId();
console.log(user.groupid); // <--------- HERE'S WHERE IM TROUBLE
// Chamar a função que envia o e-mail para o usuário.
console.log("Usuário: " + user.username + " Senha: " +
user.password);
user.save(function(err) {
if (err) {
message = getErrorMessage(err);
req.flash("error", message);
return res.redirect("/");
} else {
res.json({
message: "Cadastrado."
});
}
});
} else {
res.json({
message: "Chave não encontrada."
});
}
};
如何在不阻止处理的情况下获取 id 值?
console.log(user.groupid) 返回“undefined”,可能是因为 Node 调用函数并且在处理之前调用console.log
谢谢
最佳答案
使用回调可能是在 JavaScript(和 Node.js)中进行异步编程的最常见方法。然而,从 ES2017 开始,可以使用 Promises与 async/await 结合使用编写一些看起来像同步代码的非阻塞异步代码。
我们可以重写 getAdminId
函数,使其返回一个 Promise,而不是在回调中返回值(这无论如何都不起作用,因为在 CPS 编程中,回调中的返回值并不重要):
function getAdminId() {
return new Promise(function(resolve, reject) {
Group.findOne({
name: "admin"
},
function(err, admin) {
if (err) {
reject(new Error("Erro ao pegar o ID do admin"));
} else {
resolve(admin._id);
}
}
);
});
}
然后您可以使注册中间件异步并执行以下操作:
exports.register = async function (req, res, next) { // notice the async keyword
// ...
user.groupid = await getAdminId(); // notice the await keyword
// ...
};
关于node.js - 调用在 Controller 中同步工作的函数 - Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957171/