作者:miya的发现王国sGA_998 | 来源:互联网 | 2023-08-24 15:20
什么是child_processchild_process模块是nodejs的一个子历程模块,能够用来建立一个子历程,并实行一些使命。实行一些什么使命呢?shell敕令晓得吧,有了
什么是child_process
child_process模块是nodejs的一个子历程模块,能够用来建立一个子历程,并实行一些使命。实行一些什么使命呢?shell敕令晓得吧,有了child_process模块,就能够直接在js内里挪用shell敕令去完成一些异常酷炫的操纵了!!
举个栗子,GitHub、码云等git代码托管网站,都邑有个webHook功用,当push了新的代码后,效劳器能够拓荒一个接口去接收这个webHook的要求,并举行git pull
、npm run build
等敕令,从而到达自动化布置的目标!
来个小demo
目次构造
前端直接简单用的vue-cli
脚手架新建了个项目,后端是用的express
前端代码就不晒了,都是脚手架天生的,后端代码重要就是一个server.js
和一个实行shell的要领。
backend/server.js
backend/server.js
注重先要装置几个依靠:
express
和
body-parser
express
是主角,不必多说,
body-parser
是用来剖析post要求的参数的。
const express = require('express');
const app = express();
const port = process.env.PORT || 8080;
const www = process.env.WWW || './fontend/dist';
var bodyParser = require('body-parser')//格式化body数据
app.use(bodyParser.urlencoded({extended: false}));//body parser插件设置
app.use(bodyParser.json());//body parser插件设置
const gitPush = require('./service/git-push')//引入写的效劳
app.post('/api/git_hook',async (req, res) => {//监听这个接口
if(req.body.password !== '666'){// 这里校验post要求的暗码
res.send('暗码毛病')
return
}
const code = await gitPush()
res.send('hello world' + code)
})
app.use(express.static(www));
console.log(`serving ${www}`);
app.get('*', (req, res) => {
res.sendFile(`index.html`, { root: www });
});
app.listen(port, () => console.log(`listening on http://localhost:${port}`));
backend/service/git-push.js
const childProcess = require('child_process');
const path = require('path')
module.exports = async function (params) {
await createGitPullPromise()
return await createPackPromise()
}
function createPackPromise(){
return new Promise((res, rej) => {
const compile = childProcess.spawn('npm', ['run', 'build'], {cwd: path.resolve(__dirname, '../../fontend')})
compile.on('close', code => {
// console.log(code)
res(code)
})
})
}
function createGitPullPromise(){
return new Promise((res, rej) => {
const compile = childProcess.spawn('git', ['pull'], {cwd: path.resolve(__dirname, '../../fontend')})
compile.on('close', code => {
// console.log(code)
res(code)
})
})
}
小结
child_process模块,重如果用的child_process.spawn(),须要注重的是,这个函数只会建立异步历程,详细的API能够参考官网。异步历程的话,不会壅塞主历程的实行,所以我backend/service/git-push.js
内里用async function
来举行异步回调的掌握。child_process模块还供应了建立同步子历程的要领 child_process.spawnSync,相识nodejs比较多的同砚可能会发明,跟异步的要领比拟,就是最后面加了个Sync
,嗯,也能够这么明白吧。
愿望人人多相识下这个模块,多着手操纵下,能用到哪里 留下了异常大的设想空间!