【问题标题】:Execute node command from UI从 UI 执行节点命令
【发布时间】:2023-07-26 12:13:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我们可以看到一些代码@rishabh-shah 吗?
  • @Todd 我无法共享该代码。但是,它执行不同的操作并根据参数执行某些任务。
  • 投反对票的不是我,伙计。不过,这是您的问题,因此您有责任提供足够的信息让人们做出明智的回应。
  • @RishabhShah 如果没有代码,人们将无法真正帮助您。如果您因为它是私有代码而无法共享它,那么将您的问题提炼成一个简单的示例并粘贴该代码。你问的没有多大意义;我们需要更多信息。
  • “可以是任何本地节点js文件,它在内部调用我的另一个nodejs文件。这可能吗”是的。

标签: node.js command-line integration javascript


【解决方案1】:

我很无聊,所以我决定尝试回答这个问题,即使我不完全确定这是你要问的。如果您的意思是您只需要从节点 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。仅当您的脚本是通过 require 从另一个脚本加载时,才会填充 parent 属性。这是测试您的脚本是否直接从终端运行的更好方法。如果您在启动 app.js 文件时传入参数,例如--debug,我这样做的方式可能会出现问题。它会尝试运行一个名为“--debug”的任务,然后打印出“Unrecognized task”。启动应用程序时发送到控制台。

我建议改变这个:

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?

【讨论】:

  • 是的。我有相同类型的文件,它们根据参数执行不同的操作。抱歉没有发布代码。但是,我不想更改 js 文件(在您的情况下为 myScript.js),但是,我想通过任何中间/js 文件使用/调用该文件 nodejs,在您的情况下(myscript.js)从 extjs/sencha 中的 UI 的任何操作调用。
  • 我的 nodejs 文件(在你的情况下是 myscript),根据我们传递的参数在终端上工作正常。但是,我想使用同一个文件。
  • 是的,没有更多信息,我猜你不走运。我试过了。
  • 请告诉我你还需要我的哪个输入?
  • 我们需要代码示例。您必须编写代码来显示您要完成的工作。这是帮助你的唯一方法。我不明白为什么你不能混淆代码以避免泄露有关项目的任何内容。如果没有某种代码,任何人都无能为力。特别是因为英语不是你的第一语言。