JS:导出函数无法返回True / False

时间:2017-03-30 10:10:41

标签: javascript express

我在另一个文件中有一个函数,该函数假设检查数据库中是否有管理员,如果没有创建他。如果最后在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();

2 个答案:

答案 0 :(得分:1)

AdminUser.validate()确实会返回undefined。如果你查看该函数的正文,你可以看到它通过来自Admin.addAdminAdmin.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();
    }
});

基本思想是通过传递一个回调函数来完成后,给你的异步函数做一些事情。