我有一个Node.js CLI,我一直使用
Commander库构建.这是主执行文件中的代码.
#!/usr/bin/env node var program = require('commander'); var scmStash = require('./lib/hdqc/scmStash'); var command = {}; program .version('0.0.1') .option('-P,--Projects','List Projects') .option('-R,--Repositories','List All Repositories on Server.') .parse(process.argv); function listProjects() { scmStash.getProjectListing(function (data) { for (var i = 0; i < data.size; i++) { var project = data.values[i]; console.log(' ' + i + ' ' + project.name + ' @ ' + project.link.url); } }) } if (program.Projects) { console.log(' - Projects'); listProjects(); }
我一直在WebStorm中构建它,当我使用node.js调用命令时,一切运行完美.例如,如果我运行WebStorm运行程序执行./strack -P命令来输出项目,输出看起来像这样……
node strack -P - Projects 0 Business Insights @ /projects/BI 1 Platform @ /projects/HDP 2 H @ /projects/H 3 QC Application Code @ /projects/QCCODE 4 QC Design @ /projects/QCDESIGN 5 QC Reports @ /projects/QCREP 6 SandBox @ /projects/SAN 7 Systemic Automation Tools @ /projects/SAT 8 The Swamp @ /projects/SWAMP
但是,当我从标准bash(在WebStorm内部或在iTerm中的WebStorm之外)运行相同的’strack’命令时,则显示以下输出.
23:11 $node strack -P - Projects
当我写下这个问题时,我 – 就像在输入stackoverflow问题时经常发生的那样 – 实现了这个问题.打印出项目本身的另一个调用是异步调用,实际的应用程序会触发该调用,然后执行剩余的代码行并完成.在项目甚至返回之前,可以打印到控制台.我不确定WebStorm正在做什么来保持控制台连接到正在运行的进程,但我很乐意为我的CLI工作.关于如何重新设计此应用程序以实际将项目打印到命令行的任何想法,想法或建议?
所有代码都可在github repo这里找到.
解决方法
我认为问题在于你的while循环中的数组边界. data.size可能是你在其他8种语言中记住的东西,大声笑.
BUT it’s not in js,你正在寻找data.length.尝试这个,它被削减并有一个模拟scmStash对象,但我想你会明白我的意思:
var command,listProjects,program,scmStash; program = require('commander'); scmStash = { getRepositories: function(cb) { return cb([ { name: 'a',cloneUrl: 'b' },{ name: 'c',cloneUrl: 'd' } ]); },getProjectListing: function(cb) { return cb([ { name: "proj1",link: { url: "http://blah" } },{ name: "proj2",link: { url: "http://bluh" } } ]); } }; command = {}; listProjects = function() { return scmStash.getProjectListing(function(projects) { var i,j,len,project,results; results = []; for (i = j = 0,len = projects.length; j < len; i = ++j) { project = projects[i]; results.push(console.log(' ' + i + ' ' + project.name + ' @ ' + project.link.url)); } return results; }); };
输出:
$node .temp/adron.js -P - Projects 0 proj1 @ http://blah 1 proj2 @ http://bluh
此外,通过在variable before iterating it but it’s very minor中存储数组的长度,可以进行优化.当数组中有一百万个元素时,请担心这一点.