【问题标题】:Null Commond line argument空命令行参数
【发布时间】:2019-06-11 00:45:22
【问题描述】:

我通过命令行将大约 9 个参数传递给 Node JS 脚本。 这是我的命令:

node awsInvokeDelete.js DELETE https://Test1234.execute-api.us-west-2.amazonaws.com us-west-2 /qa/transit-connectivity/api/v1/sites/tdcloudtsttd03 AKIAJ4Y5DGqwewqeqw CFdAgsdtqweqwe/SKqDezdqweewofWrUXXBbQoMy   '{\"change_request\":\"chg0123456\"}'

我在命令行参数中将查询参数作为 JSON 传递,该参数是节点 JS 脚本中的 process.argv[9]。如果我将值传递给所有参数,但在某些情况下 process.argv[8] 将为空,它会完美运行。当我在 process.argv[8] 中传递空值时,它实际上将 argv[9] 作为 argv[8]。

如何在命令行中为下面的脚本传递空参数值。

var apigClientFactory = require('aws-api-gateway-client').default;
let awsMethod = process.argv[2],
    awsEndpoint = process.argv[3],
    awsRegion = process.argv[4],
    awsPathTemplate = process.argv[5],
    awsAccessKey = process.argv[6],
    awsSecreteKey = process.argv[7],
    awsPathParams = process.argv[8],
    awsAdditionalParams = JSON.parse(process.argv[9] || '{}');

var apigClient = apigClientFactory.newClient({
   invokeUrl: awsEndpoint, // REQUIRED
   accessKey: awsAccessKey, // REQUIRED
   secretKey: awsSecreteKey, // REQUIRED
   region: awsRegion, // REQUIRED: The region where the API is deployed.
   retryCondition: (err) => { // OPTIONAL: Callback to further control if   
    request should be retried.  Uses axon-retry plugin.
    return err.response && err.response.status === 500;
    }
  });


var param = awsPathParams;
// Template syntax follows url-template https://www.npmjs.com/package/url-template
var pathTemplate = awsPathTemplate;
var method = awsMethod;
var additionalParams = { queryParams: awsAdditionalParams, };
console.log(additionalParams);

var body = {};


apigClient.invokeApi(param, pathTemplate, method, additionalParams, body)
    .then(function(result) {
        //console.log(result.data + ": " +result)
        console.log(result.response.data)

    }).catch(function(result) {
        console.log(result.response.data)

    });

这是输出:args[8] 的值应该显示为 args[9]

args[8]: {"change_request":"chg0123456"}
args[9]: [object Object]

【问题讨论】:

    标签: node.js amazon-web-services command-line-arguments command-prompt


    【解决方案1】:

    3 个选项:

    1. 更改脚本以切换参数 8 和 9。那么即使 9 为空,您也始终拥有相同的数字。
    2. 将参数作为“”传递,而不是什么都不传递。
    3. 更改脚本,以便您解析自己的命令行并按照您喜欢的方式进行更改。

    【讨论】:

      【解决方案2】:

      您的脚本无法处理您提供的输入(如果您实际上添加了缺少的参数),因为'{\"change_request\":\"chg0123456\"}' 不是 JS 可以解析为 JSON 字符串的东西。此外,您没有将输入中的任何空值传递给脚本(只是一个空白不被视为实际输入)。

      您需要将其更改为此 '{"change_request":"chg0123456"}' 并将空值作为空字符串 '' 传递。

      此输入正常工作。

      node index.js DELETE https://Test1234.execute-api.us-west-2.amazonaws.com us-west-2 /qa/transit-connectivity/api/v1/sites/tdcloudtsttd03 AKIAJ4Y5DGqwewqeqw CFdAgsdtqweqwe/SKqDezdqweewofWrUXXBbQoMy '' '{"change_request":"chg0123456"}'
      

      如果您确实需要该格式的对象,则需要从其中删除 \ 字符,然后才能对其调用 JSON.parse

      awsAdditionalParams = JSON.parse(
          process.argv[9].split('\\').join('') || '{}'
      );
      

      如果你首先要检查最后一个参数是否不为空,然后才运行上面的代码,你可以像这样使用三元运算符。

      awsAdditionalParams = process.argv[9]
          ? JSON.parse(process.argv[9].split('\\').join('') || '{}')
          : '';
      

      【讨论】:

      • 感谢 Matus,这很有帮助。我还有一个问题,关于在节点 js 脚本中添加 If 条件。我已经修改了我的代码以删除“\\”,然后解析 Json 格式并将 '""' 作为空字符串传递并且工作正常。
      • 我还有一个问题,如果 args[9] 没有任何参数表示为空,那么如何检查 args[9] 是否为空,如果不是,则只执行 'JSON.parse(process. argv[9].split('\\').join('') || '{}');'
      • @KiranPatil 我已将其添加到答案中。
      猜你喜欢
      • 2014-05-22
      • 2011-06-04
      • 2015-04-12
      • 2014-12-09
      • 2011-11-11
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多