我对nodejs不是很熟悉,但是我需要一些指导。任何帮助将不胜感激。
我有从命令行运行的nodejs文件。
filename arguments
并且无论我传递什么参数都会做一些操作。
现在,我有html页面和不同的选项来选择不同的操作。根据选择,我可以将我的参数传递给任何文件。可以是任何本地节点js文件,它在内部调用我的另一个nodejs文件。那可能吗 ?我不确定我的方法是什么!
我总是要从终端运行不同的命令来执行不同的任务。所以,我的目标是减少开销。我可以从UI中选择选项,并通过nodejs文件进行操作。
答案 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?