从UI执行节点命令

时间:2014-12-12 18:19:57

标签: node.js command-line integration javascript

我对nodejs不是很熟悉,但是我需要一些指导。任何帮助将不胜感激。

我有从命令行运行的nodejs文件。

filename arguments并且无论我传递什么参数都会做一些操作。

现在,我有html页面和不同的选项来选择不同的操作。根据选择,我可以将我的参数传递给任何文件。可以是任何本地节点js文件,它在内部调用我的另一个nodejs文件。那可能吗 ?我不确定我的方法是什么!

我总是要从终端运行不同的命令来执行不同的任务。所以,我的目标是减少开销。我可以从UI中选择选项,并通过nodejs文件进行操作。

1 个答案:

答案 0 :(得分:2)

我很无聊所以我决定尽力回答这个问题,尽管我并不完全确定这是你所要求的。如果您的意思是您只需要从节点Web应用程序运行节点脚本,并且通常从终端运行该脚本,只需require您的脚本并以编程方式运行它。

让我们假装你运行的这个脚本看起来像这样:

// myscript.js

var task = process.argv[2];
if (!task) {
  console.log('Please provide a task.');
  return;
}

switch (task.toLowerCase()) {
  case 'task1':
    console.log('Performed Task 1');
    break;
  case 'task2':
    console.log('Performed Task 2');
    break;
  default:
    console.log('Unrecognized task.');
    break;
}

通过这种方式,您通常会执行以下操作:

  

$ node myscript task1

相反,您可以将脚本修改为如下所示:

// Define our task logic as functions attached to exports.
// This allows our script to be required by other node apps.
exports.task1 = function () {
  console.log('Performed Task 1');
};

exports.task2 = function () {
  console.log('Performed Task 2');
};

// If process.argv has more than 2 items then we know
// this is running from the terminal and the third item
// is the task we want to run :)
if (process.argv.length > 2) {
  var task = process.argv[2];
  if (!task) {
    console.error('Please provide a task.'); 
    return;
  }

  // Check the 3rd command line argument. If it matches a
  // task name, invoke the related task function.
  if (exports.hasOwnProperty(task)) {
    exports[task]();
  } else {
    console.error('Unrecognized task.');
  }
}

现在你可以用同样的方式从终端运行它:

  

$ node myscript task1

或者您可以从应用程序中请求它,包括Web应用程序:

// app.js

var taskScript = require('./myscript.js');
taskScript.task1();
taskScript.task2();

单击动画gif以获得更平滑的版本。请记住,如果用户通过按钮或其他东西从您的Web应用程序调用您的任务脚本,该脚本将在Web服务器上运行,而不是在用户的本地计算机上运行。这应该是显而易见的,但我认为无论如何我都会提醒你。)


修改

我已经播放了视频,所以我不会重做它,但我刚发现module.parent。如果您的脚本是通过parent从另一个脚本加载的,则仅填充require属性。这是测试脚本是否直接从终端运行的更好方法。如果您在启动app.js文件时传递参数,我可能会遇到问题,例如--debug。它会尝试运行一个名为“--debug”的任务,然后打印出“无法识别的任务”。启动应用程序时到控制台。

我建议改变这个:

if (process.argv.length > 2) {

对此:

if (!module.parent) {

参考:Can I know, in node.js, if my script is being run directly or being loaded by another script?