想利用nodejs执行一个nodejs脚本
发布于 6 年前 作者 zzuzsj 14106 次浏览 来自 问答

利用nodejs执行node脚本


如题所示,node小白想知道是否在nodejs代码内执行一个nodejs写的脚本,并且将脚本运行的结果获取到。我看了child_process模块,但是不知道它的方法对node脚本是不是有效,小白看文档,看得很绝望orz。

21 回复

额,你说的不会是require吧

@mumudev 。。。就比如说已经写好了一个node爬虫脚本,我想在另一个node脚本里面运行这个爬虫脚本,这种类型的。

@godghdai 我看看先~

child_process就行,官网有例子。

来自酷炫的 CNodeMD

@zzuzsj 没特别理解,require本身不就是在做这个事情嘛,你在a.js里var b = require(‘b.js’);然后执行b()不就是执行了b脚本嘛

@mumudev 感觉他说的就是这个意思

@zzuzsj 只要你的另一个脚本放在了你的环境变量中,也就是比如可以直接在终端使用了,那就可以用 spawn 来执行这个脚本。比如我学习时写过一个发送邮件的小脚本,可能是这样的:

// gm2.js
#!/usr/bin/env node
const nodemailer = require('nodemailer')
// process.argv[2] 为目标邮箱
// process.argv[3] 为主题
// process.argv[4] 为内容,或者一个文件(fs.readdirSync(process.cwd()).includes 判断)

/**
 * 发送邮件
 */

这个小脚本我放置在 ubuntu 的环境变量中,然后每次直接通过 gm2 xxx@qq.com xxx xxx 来使用,那么在另一个文件中,比如我爬虫每五分钟检测小说是否更新,我就可以直接使用

const { spawn } = require('child_process')

spawn('gm2',['xxx@qq.com','小说章节名','小说内容'])

来发送最新更新的小说到我的邮箱。

总结就是两点:

  • 使用 #!/usr/bin/env node 来自动调用解释器,避免每次使用 node xxxx.js
  • 将脚本放置在环境变量 PATH 中,避免使用路径 ./path-to-script/xxx.js

@leavesdrift 是一种有效方法,但是因为脚本数目量比较多,我不想添加一个脚本就配置一次变量。想直接通过node shell.js这种模式执行代码可以吗?大神~

@mumudev 利用require应该需要把脚本改写为对象输出吧,但是不想去改写原文件,想直接利用node shell.js这种命令行启动它。

@zzuzsj 你如果想用shelljs的方式可以和我一样这样试试 这个是一个执行命令的脚本QQ20171027-093619.png 引入tasksTest的文件,具体的一些你想测试的东西写在这里面,QQ20171027-093604.png 自己想要执行什么就调用什么就可以了,如图我要调用 constants QQ20171027-094007.png

child_process

@hewentaowx 刚发现确实我的需求child_process就可以实现,不过你的明显更具有组织性。想问一下你所测试的脚本输出的都是一个对象么?还是引进来执行即可?

@lpbird 是的~刚看到~exec可以实现

@zzuzsj 输出不一定是对象根据你自己的需求去定 有的是我自己写的数据结构有的是调用三方返回的一些东西

@zzuzsj 不想配置环境变量就把这些脚本放进一个固定的文件夹,比如 script,使用就直接:

const { spawn } = require('childe_process')
const dir = /realpath-to-script-directory
const { resolve } = require('path')
const scriptArr = [['scriptname1', argsArr1], ['scriptname2', argsArr2],['scriptname3',argsArr3]]

scriptArr.forEach((script) => {
  const [scriptName, argArr] = script
  spawn(resolve(dir, scriptName), argArr)
})

具体得根据你的实际情况来处理,另外我记得朴老师说 exec 有内存限制

@leavesdrift 老哥 对小说很钟爱啊

@leavesdrift 我觉得这种方法比较好~emmm,内存限制,是指脚本运行所占用的内存么?

应该是可以的吧

@zzuzsj 按照朴老师在 anywhere 中写的是这样,512k的缓存限制,当然我不清楚,原文:

https://github.com/JacksonTian/anywhere/blob/master/bin/anywhere

@leavesdrift ok~十分感谢

回到顶部