利用nodejs执行node脚本
如题所示,node小白想知道是否在nodejs代码内执行一个nodejs写的脚本,并且将脚本运行的结果获取到。我看了child_process模块,但是不知道它的方法对node脚本是不是有效,小白看文档,看得很绝望orz。
额,你说的不会是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 [email protected] xxx xxx
来使用,那么在另一个文件中,比如我爬虫每五分钟检测小说是否更新,我就可以直接使用
const { spawn } = require('child_process')
spawn('gm2',['[email protected]','小说章节名','小说内容'])
来发送最新更新的小说到我的邮箱。
总结就是两点:
- 使用
#!/usr/bin/env node
来自动调用解释器,避免每次使用node xxxx.js
- 将脚本放置在环境变量 PATH 中,避免使用路径
./path-to-script/xxx.js
@leavesdrift 是一种有效方法,但是因为脚本数目量比较多,我不想添加一个脚本就配置一次变量。想直接通过node shell.js这种模式执行代码可以吗?大神~
@mumudev 利用require应该需要把脚本改写为对象输出吧,但是不想去改写原文件,想直接利用node shell.js这种命令行启动它。
@zzuzsj 你如果想用shelljs的方式可以和我一样这样试试 这个是一个执行命令的脚本 引入tasksTest的文件,具体的一些你想测试的东西写在这里面, 自己想要执行什么就调用什么就可以了,如图我要调用 constants
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
的缓存限制,当然我不清楚,原文:
@leavesdrift ok~十分感谢