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

我想从我的命令行得到一个argv,当我要启动我的服务器,然后我想把它设置为一个模块的常量。

例如,我想从命令行定义我的日志文件path:

我的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'我没有得到我的node starter.js --logpath='../../custom/info.txt'的logpath。

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

控制台输出如下所示:

 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 

我如何克服它,并通过我的日志path作为命令行参数?

提前致谢。

你的init()函数在starter.js使用require('./start_server') 。 当你使用require() ,文件及其所有的依赖关系都被加载。 这意味着在这个过程中,你还执行了require('./common/loghandler') ,它在server.init()中运行server.init()之前完成。 由于server.logpath此时尚未设置,因此您将得到一个空值。

除此之外, module.exports是在需要的时候设置的,以后改变这个值是没有任何作用的。 要解决您遇到的问题,您应该避免在应用程序完全加载之前使用函数,并将返回值放入模块中。