我在另一个文件中有一个函数,该函数假设检查数据库中是否有管理员,如果没有创建他。如果最后在DB中有一个管理员(已创建或已经存在),则返回true,否则返回false。
/*AdminUser.js*/
const Admin = require('../models/admin');
const mongoose = require('mongoose');
module.exports = {
validate: function() {
Admin.getAdminByRealID("1212", (error, admin) => {
if (admin) {
console.log("Main admin is Booted");
return true;
} else {
console.log("Booting main admin");
let newAdmin = new Admin({
ID: "1212",
account: {
username: "Admin",
password: "1212",
token: "Admin"
},
name: {
first: "Admin",
last: "Delta"
},
communication: {
email: "delta@example.com",
phone: "1212"
}
});
Admin.addAdmin(newAdmin, (error, admin) => {
if (error) {
console.log("Admin reboot failed");
return false;
} else {
console.log("Admin have been initialized");
return true;
}
});
}
});
}
}
在主应用程序中,我有这个:
if (AdminUser.validate()) {
app.listen(port, () => {
console.log('Server started on port: ' + port);
});
} else {
console.log('Fail to run Server');
process.exit();
}
函数(.validate)始终返回“未定义”对象,服务器无法启动。有人可以解释为什么返回值不是真/假。
函数(.validate)会打印“主管理员启动”,我猜它会返回下一行的真值。
使用app = express();
答案 0 :(得分:1)
AdminUser.validate()
确实会返回undefined
。如果你查看该函数的正文,你可以看到它通过来自Admin.addAdmin
和Admin.getAdminByRealID
的回调来接收它的结果。这意味着要在函数体之外处理这些结果,您应该为validate
方法提供回调参数。这种技术非常适合节点异步编程(尽管Promises和await
是更现代的方法 - 但这超出了本答案的范围。)
const Admin = require('../models/admin');
const mongoose = require('mongoose');
module.exports = {
validate: function(done) {
Admin.getAdminByRealID("1212", (error, admin) => {
if (admin) {
console.log("Main admin is Booted");
done(true);
} else {
console.log("Booting main admin");
let newAdmin = new Admin({
ID: "1212",
account: {
username: "Admin",
password: "1212",
token: "Admin"
},
name: {
first: "Admin",
last: "Delta"
},
communication: {
email: "delta@example.com",
phone: "1212"
}
});
Admin.addAdmin(newAdmin, (error, admin) => {
if (error) {
console.log("Admin reboot failed");
done(false);
} else {
console.log("Admin have been initialized");
done(true);
}
});
}
});
}
}
你会这样称呼它:
AdminUser.validate((ok)=> {
if(ok){
app.listen(port, () => {
console.log('Server started on port: ' + port);
});
} else {
console.log('Fail to run Server');
process.exit(1);
}
});
答案 1 :(得分:1)
你的validate()
函数是异步的:它在执行时不会返回任何内容(完全是字面意思,因为它没有return
指令)。相反,它会查询数据库并在完成后执行某些操作。
因此,在主应用程序中,您不能只调用validate()
并期望得到结果;相反,你必须进行设置,以便在validate()
完成后你的应用可以继续。这样做的经典方法是使用回调。类似的东西:
validate: function(callback) {
...
if (error) {
console.log("Admin reboot failed");
callback(false);
} else {
console.log("Admin have been initialized");
callback(true);
}
...
}
主应用中的代码段可能类似于:
AdminUser.validate(function afterValidation(isValid) {
if (isValid) {
app.listen(port, () => {
console.log('Server started on port: ' + port);
});
} else {
console.log('Fail to run Server');
process.exit();
}
});
基本思想是通过传递一个回调函数来完成后,给你的异步函数做一些事情。