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
是在需要的时候设置的,以后改变这个值是没有任何作用的。 要解决您遇到的问题,您应该避免在应用程序完全加载之前使用函数,并将返回值放入模块中。