2017-02-14 62 views
2

我很新的使用NodeJS CLI命令process.argv能够将包含对象的变量传递给我的函数方法,但似乎没有找到我的对象内的属性值当这个过程被调用时。我在我的对象siteUrl的第二个属性处收到错误,似乎无法弄清楚是否是process.argv编译信息的方式,或者如果我错误地使用该命令。如果我将process.argv替换为params,那么我不会收到错误。Nodejs过程CLI变量包含对象

这是我的终端的命令:

node app.js params

这是我的变量设置:

var siteUrl = encodeURIComponent('http://www.test.com/'); 

    var params = { 
     auth: auth, 
     siteUrl: siteUrl, 
     resource: { 
      'startDate': moment().subtract(3, 'days').format("YYYY-MM-DD"), 
      'endDate': moment().subtract(2, 'days').format("YYYY-MM-DD"), 
      'dimensions': ['query', 'page'], 
      'dimensionFilterGroups': [{ 
       'filters': [{ 
       'dimension': 'country', 
       'operator': 'equals', 
       'expression': 'USA' 
       }] 
      }] 
     } 

这是我的方法

var query = webmasters.searchanalytics.query(process.argv, function(err, res){ 
     var formattedQueryList = []; 
     if (err){ 
      console.log('This is the error: ' + err); 
     } else { ... } 

我还记录我的对象以确保值存在:

console.log(params.resource.startDate) 
    console.log(params.resource.startDate) 
    console.log(params.resource.endDate) 
    console.log(params.siteUrl) 
    console.log(siteUrl) 

这里是的console.log:

2017-02-11 
2017-02-12 
http%3A%2F%2Fwww.test.com%2F 
http%3A%2F%2Fwww.test.com%2F 
This is the error: Error: Missing required parameters: siteUrl 
+0

'process.argv'是一个字符串数组而不是对象 –

回答

2

当你传递一个参数节点把它作为字符串。所以你必须关心Json格式。
例如
你想传递一个对象的人,在这里你可以明确地设置\”
node lib/index.js {\"name\":\"Bob\"}

或与包裹JSON以不同的方式:
node lib/index.js '{"name":"Bob"}'

而在你的代码,你应该解析字符串作为JSON。

const obj = JSON.parse(process.argv[2]); 
console.log(obj); 
console.log('Hello ' + obj.name); 

,这将给你Hello Bob 。在你的情况下,你可以使用JSON.stringify(params)作为参数传递之前。
希望这个帮助来澄清。

+0

谢谢你的解释和可能的解决方案。我认为最好使用process.argv来填充我的对象中的各个属性值,而不是我目前的方法 – cphill

0

process.argv是附加到终端命令的参数列表。

在你的情况下,process.argv[2]将是字符串params,而不是实际的变量值。您需要通过CLI传递JSON本身(通过适当的转义),然后使用JSON.parse解析它,或者手动检查process.argv[2]的值。