代码之家  ›  专栏  ›  技术社区  ›  apavliukov

分叉时节点child\u进程传递argv

  •  3
  • apavliukov  · 技术社区  · 7 年前

    我有Express server的节点应用程序。我在服务器文件夹中也有节点脚本。在某些事件中,我需要从单独的节点脚本获取数据,所以我创建子进程。

    没有参数,一切正常,但我需要从父进程传递一些数据。

    var express = require('express');
    var router = express.Router();
    var child_process = require('child_process');
    
    router.get('/:site/start', function(req, res, next) {
            const basedir = req.app.get('basedir');
            const child_script_path = basedir + '/scripts/script.js';
            const child_argv = [
                '--slowmo=0',
                '--headless=1'
            ];
    
            child = child_process.fork(child_script_path, {
                execArgv: child_argv
            });
    
            ...
        }
    });
    

    当我尝试通过Express传递参数并运行脚本时,会显示以下错误:

    /home/user/.nvm/versions/node/v8.9.4/bin/node: bad option: --slowmo=0
    /home/user/.nvm/versions/node/v8.9.4/bin/node: bad option: --headless=1
    

    但当我从命令行运行脚本时,如:

    node /scripts/script.js --slowmo=0 --headless=1
    

    我没有收到任何错误,脚本可以从命令行捕获参数。

    在这种情况下,如何将参数传递给子脚本?

    Ubuntu 16.04

    快递4.15.5

    1 回复  |  直到 3 年前
        1
  •  6
  •   Pang Ajmal PraveeN    3 年前

    execArgv 选项用于传递执行过程的参数,而不是脚本的参数。
    这对于将特定的执行环境传递给分叉的进程可能很有用。

    如果要向脚本传递参数,应使用 args .
    child_process.fork(modulePath[, args][, options])

    例子:

    const child_process = require('child_process');
    
    const child_script_path = './script.js';
    const child_argv = [
      '--foo',
      '--bar'
    ]
    const child_execArgv = [
      '--use-strict'
    ]
    
    let child = child_process.fork(child_script_path, child_argv, {
      execArgv: child_execArgv  // script.js will be executed in strict mode
    })
    
    // script.js
    console.log(process.argv[2], process.argv[3])  // --foo --bar