在 Node.js 中,使用 Prompt 请求一个值,并在主 js 文件中使用该值

In Node.js, asking for a value using Prompt, and using that value in a main js file

我是 的新手,它似乎很容易使用,但是当涉及到使用命令行获取值并返回该值以用于另一个包或 .js,似乎比我想象的要难。

长话短说,我已经成功地使用了 package (akamai-ccu-purge), to enter a file to purge on the 网络。

我想通过提示用户输入他们想要清除的文件然后在 包中使用它来使其更加动态。

在使用 var stdin = process.openStdin(); 进行了几次尝试后,我实际上发现了另一个名为 Promptnpm 包,它似乎更容易。这两种方式似乎都有同样的问题。

节点似乎不想停下来等待输入。它似乎想要在不等待输入的情况下自动进行清除,即使我已经先调用了该模块。它实际上到了我应该输入文件的地步,但它没有等待。

我在这里的理解或用法肯定遗漏了一些东西,我做错了什么?

到目前为止我的代码是:

var purgeUrl = require('./getUrl2');  

var PurgerFactory = require('../../node_modules/akamai-ccu-purge/index'); // this is the directory where the index.js of the node module was installed

// area where I placed the authentication tokens 
var config = {
  clientToken: //my tokens and secrets akamai requires
};

// area where urls are placed. More than one can be listed with comma separated values 
var objects = [
  purgeUrl // I am trying to pull this from the getUrl2 module
];

// Go for it! 
var Purger = PurgerFactory.create(config);

Purger.purgeObjects(objects, function(err, res) {
  console.log('------------------------');
  console.log('Purge Result:', res.body);
  console.log('------------------------');
  Purger.checkPurgeStatus(res.body.progressUri, function(err, res) {
    console.log('Purge Status', res.body);
    console.log('------------------------');
    Purger.checkQueueLength(function(err, res) {
      console.log('Queue Length', res.body);
      console.log('------------------------');
    });
  });
});

getUrl2 模块如下所示:

var prompt = require('../../node_modules/prompt'); 
  // 
  // Start the prompt 
  // 
  prompt.start();

  // 
  // Get property from the user 
  // 
  prompt.get(['newUrl'], function (err, result) {
    // 
    // Log the results. 
    // 
    console.log('Command-line input received:');
    console.log('  http://example.com/custom/' + result.newUrl);
    var purgeUrl = 'http://example.com/custom/' + result.newUrl;
    console.log(purgeUrl);
    module.exports = purgeUrl;
  });

再次感谢您的帮助!

我可能只允许 getURL2 公开将在主模块中调用的 方法 。例如:

// getURL2

var prompt = require('../../node_modules/prompt'); 

module.exports = {
  start: function(callback) {

    prompt.start();

    prompt.get(['newUrl'], function (err, result) {
      // the callback is defined in your main module
      return callback('http://example.com/custom/' + result.newUrl);
    });

  }
}

然后在你的主模块中:

require('./getUrl2').start(function(purgeURL) {
  // do stuff with the purgeURL defined in the other module
});

实现方式可能不同,但从概念上讲,您需要使第二个模块成为该输入的结果,该模块需要用户进行某种输入。回调是执行此操作的常用方法(Promises 也是如此)。但是,由于 prompt 不一定公开需要 Promise 的方法,因此您可以使用普通的旧回调来实现。

您可能还想搜索有关使用 Node 编写命令行工具(有时称为 CLI)或命令行应用程序的文章。我发现以下文章对我自己解决这个问题很有帮助:

http://javascriptplayground.com/blog/2015/03/node-command-line-tool/

此外,command-line-args 模块对我来说效果很好(尽管还有许多其他模块可供选择):

https://www.npmjs.com/package/command-line-args

祝你好运!