【问题标题】:JS : exported Function fail to return True/FalseJS:导出函数无法返回 True/False
【发布时间】:2017-08-24 04:43:16
【问题描述】:

我在另一个文件中有一个函数,该函数假设检查数据库中是否有管理员,如果没有创建他。如果到最后数据库中有管理员(创建或已经存在),则返回 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) 总是返回一个“未定义”对象并且服务器无法启动。有人能解释一下为什么返回值不是 True/False 吗?

函数(.validate)确实打印“主管理员已启动”,我猜它在下一行返回真值。

使用 app = express();

【问题讨论】:

    标签: javascript express


    【解决方案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);
      }
    });
    

    【讨论】:

      【解决方案2】:

      您的 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);
          }
          ...
      }
      

      您在主应用程序中的 sn-p 可能类似于:

      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();
          }
      });
      

      基本思想是在异步函数完成后,通过传递一个回调函数来执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多