ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

nodejs 服务终端使用 nodemon 运行脚本时实时输出

2021-04-06 18:03:20  阅读:232  来源: 互联网

标签:cmd stdout nodejs nodemon 实时 server stderr child js


nodejs 服务终端使用 nodemon 运行脚本时实时输出

  • 运行命令 node run.js
  • run.js 中又运行了命令 node server.js
  • 要求 server.js 中由 cp.spawn 运行的命令能在控制台实时输出

使用 nodemon 来运行 server.js

  • run.js
/**
# nodejs 服务终端实时输出
- 运行命令 node run.js
- run.js 中又运行了命令 node server.js
- 要求 server.js 中由 cp.spawn 运行的命令能在控制台实时输出
 */

new Promise(async () => { // 启动 server.js
  const nodemon = require(`nodemon`)
  nodemon({
    ignoreRoot: [],
    exec: `node "server.js"`,
    watch: [`server.js`],
    stdout: false,
  })
  .on('readable', function(arg) { // the `readable` event indicates that data is ready to pick up
    // console.log(`readable`, arg)
    this.stdout.pipe(process.stdout) // 把子进程的输出定向到本进入输出
    this.stderr.pipe(process.stderr) // 错误输出, 例如按需安装依赖时无权限
    this.stdout.on(`data`, data => {
      log = String(data)
    })
  })
})

动态安装依赖

  • server.js
new Promise(async () => {
  const cmd = `cnpm i cnpm@6.1.1 --product --no-save --registry=https://registry.npm.taobao.org/`
  // const cmd = `tree`
  console.log(`cmd`, cmd)
  await spawn(
    `npx`, cmd.split(/\s+/),
    {
      // stdio: [0, `pipe`, 2], // 仅 server.js 可实时输出
      // stdio: `pipe`, // x
      // stdio: `ignore`, // x
      // stdio: `inherit`, // x
      // stdio: [process.stdin, process.stdout, process.stderr], // x
      // stdio:  [ 'ignore', 1, 2 ], // x
      // detached: true,
      // stdio: "inherit"
    }
  )
  console.log(`运行结束`)
})

/**
 * 以 Promise 方式运行 spawn
 * @param {*} cmd 主程序
 * @param {*} args 程序参数数组
 * @param {*} opts spawn 选项
 */
function spawn (cmd, args, opts) {
  opts = { stdio: `inherit`, ...opts }
  opts.shell = opts.shell || process.platform === 'win32'
  return new Promise((resolve, reject) => {
    const cp = require('child_process')
    const child = cp.spawn(cmd, args, opts)
    let stdout = ''
    let stderr = ''
    child.stdout && child.stdout.on('data', d => { stdout += d; console.log(`stdout`, stdout) })
    child.stderr && child.stderr.on('data', d => { stderr += d; console.log(`stderr`, stderr) })
    child.on('error', reject)
    child.on('close', code => {
      resolve({code, stdout, stderr})
    })
  })
}

以上代码摘自 mockm

标签:cmd,stdout,nodejs,nodemon,实时,server,stderr,child,js
来源: https://www.cnblogs.com/daysme/p/14623018.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有