Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:导出的函数无法返回真/假_Javascript_Express - Fatal编程技术网

Javascript JS:导出的函数无法返回真/假

Javascript JS:导出的函数无法返回真/假,javascript,express,Javascript,Express,我在另一个文件中有一个函数,该函数假设检查数据库中是否有管理员,如果没有创建管理员。如果数据库中有一个管理员(已创建或已创建),则返回true,否则将返回false /*AdminUser.js*/ const Admin = require('../models/admin'); const mongoose = require('mongoose'); module.exports = { validate: function() { Admin.getAdminByRealID(

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

AdminUser.validate()
确实返回
undefined
。如果查看该函数的主体,可以看到它通过
Admin.addAdmin
Admin.getAdminByRealID
的回调接收结果。这意味着要在函数体之外处理这些结果,您应该向
validate
方法提供回调参数。这种技术对于节点异步编程来说是相当标准的(虽然Promises和
await
是更现代的方法,但这超出了本答案的范围)

你会这样称呼它:

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);
  }
});
AdminUser.validate()
确实返回
undefined
。如果查看该函数的主体,可以看到它通过
Admin.addAdmin
Admin.getAdminByRealID
的回调接收结果。这意味着要在函数体之外处理这些结果,您应该向
validate
方法提供回调参数。这种技术对于节点异步编程来说是相当标准的(虽然Promises和
await
是更现代的方法,但这超出了本答案的范围)

你会这样称呼它:

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);
  }
});
您的
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();
    }
});
主应用程序中的代码片段可能类似于:

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();
    }
});
基本思想是,在异步函数完成后,通过传递一个回调函数来执行它,让它做一些事情。

您的
validate()
函数是异步的:它在执行时不返回任何内容(确切地说,因为它没有
返回
指令)。相反,它查询数据库,并在完成时执行某些操作

因此,在主应用程序中,您不能只调用
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();
    }
});
主应用程序中的代码片段可能类似于:

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();
    }
});
其基本思想是,在异步函数完成后,通过传递回调函数来执行它,从而给它一些事情