Nodejs将命令行参数设置为常量

时间:2013-09-11 13:52:20

标签: javascript node.js command-line-arguments

我想在启动服务器时从命令行获取argv,然后我想将其设置为模块的常量。

例如,我想从命令行界定我的日志文件路径:

我的starter.js看起来像:

var optimist = require("optimist");
var server = require("./start_server");
var argv = optimist.describe('logpath', 'logptah for info').argv;
server.init({logpath:argv.logpath});

我的start_server.js看起来像是:

    var restify = require('restify');
    var server = restify.createServer({
        name: 'dummy-project'
    });
    module.exports.logpath = null;
    function init(args){
        server.listen(1234, function() {
            console.log("inside logs");
            console.log(args.logpath);
            module.exports.logpath = args.logpath;
            console.log('%s listening at %s', server.name, server.url);
        });
    };
    module.exports.init = init;
    var fun = require('./common/loghandler');

我的loghandler.js看起来像:

var server = require('./../start_server');
console.log("inside log handler");
var LOGPATH = server.logpath;
console.log(LOGPATH);

当我跑步时node starter.js --logpath='../../custom/info.txt' 我没有在loghandler中获取logpath。

似乎在server.listen之前调用了logpath处理程序。

控制台输出如下:

node starter.js --logpath='../../custom/info.txt'
inside log handler
null
inside log handler 
../../custom/info.txt
dummy-project listening at http://0.0.0.0:1234

我如何克服它并将我的日志路径作为命令行参数传递?

提前致谢。

1 个答案:

答案 0 :(得分:1)

init() starter.js功能在require('./start_server')使用require()后执行。使用require('./common/loghandler')时,将加载该文件及其所有依赖项。这意味着在此过程中,您还执行了server.init(),该starter.jsserver.logpath中运行module.exports之前完成。由于此时尚未设置{{1}},因此您将获得空值。

除此之外,{{1}}设置为需要时间,稍后更改值无效。要解决您遇到的问题,应该避免在应用程序完全加载之前使用函数,并在模块中放置返回值。