如何将promise结果传递给module.exports

时间:2016-12-13 17:20:01

标签: node.js promise

有人知道如何从外部更新module.exports。

我有这样的模块,需要另一个工具Nightwatch(需要js配置)。我坚持承诺,不知道如何解决这个问题。因为模块加载start_process未定义。

// local.js
module.exports = {
    host: "127.0.0.1",
    port: "4444",
    start_process: undefined,
    server_path: "./node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.53.1.jar",
    cli_args: {
        "webdriver.chrome.driver": "./node_modules/chromedriver/lib/chromedriver/chromedriver",
        "driver.version": "2.24"
    }
};

require('tcp-port-used').check(4444).then((inUse) => {
    module.exports.start_process = !inUse;
    return module.exports;
});

// nightwatch.conf.js
var server = require("./local.js");
console.log(server.start_process);

2 个答案:

答案 0 :(得分:1)

刚刚加载模块时,值仍为 undefined。你要么必须找到一种同步调用tcp-port-used的方法(这通常是被鄙视但在启动时有些可接受),或者你只是导出了承诺本身:

module.exports = require('tcp-port-used').check(4444).then(inUse => {
    return {
        host: "127.0.0.1",
        port: "4444",
        start_process: !inUse,
        server_path: "./node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.53.1.jar",
        cli_args: {
            "webdriver.chrome.driver": "./node_modules/chromedriver/lib/chromedriver/chromedriver",
            "driver.version": "2.24"
        }
    };
});

无论谁想要使用模块中的属性,都必须等待它们可用。

答案 1 :(得分:-1)

当你做

module.exports.start_process = !inUse;

实际上是在修改调用者模块的导出,而不是具有start_process变量的导出。试试这个:

var foreignmodule = require('tcp-port-used');
foreignmodule.check(4444).then((inUse) => {
    foreignmodule.start_process = !inUse;
    return module.exports;
});