资讯专栏INFORMATION COLUMN

nodejs最酷炫的模块——child_process - 子进程

Donne / 2480人阅读

摘要:什么是模块是的一个子进程模块,可以用来创建一个子进程,并执行一些任务。格式化数据插件配置插件配置引入写的服务监听这个接口这里校验请求的密码密码错误小结模块,主要是用的,需要注意的是,这个函数只会创建异步进程,具体的可以参考官网。

什么是child_process

child_process模块是nodejs的一个子进程模块,可以用来创建一个子进程,并执行一些任务。执行一些什么任务呢?shell命令知道吧,有了child_process模块,就可以直接在js里面调用shell命令去完成一些非常酷炫的操作了!!
举个栗子,GitHub、码云等git代码托管网站,都会有个webHook功能,当push了新的代码后,服务器可以开辟一个接口去接受这个webHook的请求,并进行git pullnpm run build等命令,从而达到自动化部署的目的!

来个小demo 目录结构

前端直接简单用的vue-cli脚手架新建了个项目,后端是用的express

前端代码就不晒了,都是脚手架生成的,后端代码主要就是一个server.js和一个执行shell的方法。

backend/server.js
backend/server.js
注意先要安装几个依赖:expressbody-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,嗯,也可以这么理解吧。
希望大家多了解下这个模块,多动手操作下,能用到哪里 留下了非常大的想象空间!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96965.html

相关文章

  • nodejs中的进程,深入解析child_process模块和cluster模块

    摘要:严格来说,并不是单线程的。其他异步和事件驱动相关的线程通过来实现内部的线程池和线程调度。线程是最小的进程,因此也是单进程的。子进程中执行的是非程序,提供一组参数后,执行的结果以回调的形式返回。在子进程中通过和的机制来接收和发送消息。   node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO...

    JinB 评论0 收藏0
  • nodeJS进程

    摘要:通过将的给出来的进程。恩吞吐率关于吞吐率有多种解读,一种是描绘服务器单位时间处理请求的能力。而根据这个描述的话他的单位就为而这个指标就是上面数据中的当然,肯定是越大越好了吞吐量这个和上面的吞吐率很有点关系的。 首先郑重声明:nodeJS 是一门单线程!异步!非阻塞语言!nodeJS 是一门单线程!异步!非阻塞语言!nodeJS 是一门单线程!异步!非阻塞语言! 重要的事情说3遍。 因为...

    happen 评论0 收藏0
  • nodeJS进程

    摘要:通过将的给出来的进程。恩吞吐率关于吞吐率有多种解读,一种是描绘服务器单位时间处理请求的能力。而根据这个描述的话他的单位就为而这个指标就是上面数据中的当然,肯定是越大越好了吞吐量这个和上面的吞吐率很有点关系的。 首先郑重声明:nodeJS 是一门单线程!异步!非阻塞语言!nodeJS 是一门单线程!异步!非阻塞语言!nodeJS 是一门单线程!异步!非阻塞语言! 重要的事情说3遍。 因为...

    james 评论0 收藏0
  • 通过源码解析 Node.js 中进程间通信中的 socket 句柄传递

    摘要:子进程使用反序列化消息字符串为消息对象。在调用这类方法时,遍历列表中的实例发送内部消息,子进程列表中的对应项收到内部消息并处理返回,父进程中再结合返回结果和对应着这个类实例维护的信息,保证功能的正确性。 在 Node.js 中,当我们使用 child_process 模块创建子进程后,会返回一个 ChildProcess 类的实例,通过调用 ChildProcess#send(mess...

    HackerShell 评论0 收藏0
  • 深入浅出nodeJS - 4 - (玩转进程、测试、产品化)

    摘要:进程间通信的目的是为了让不同的进程能够互相访问资源,并进程协调工作。这个过程的示意图如下端口共同监听集群稳定之路进程事件自动重启负载均衡状态共享模块工作原理事件二测试单元测试性能测试三产品化项目工程化部署流程性能日志监控报警稳定性异构共存 内容 9.玩转进程10.测试11.产品化 一、玩转进程 node的单线程只不过是js层面的单线程,是基于V8引擎的单线程,因为,V8的缘故,前后...

    henry14 评论0 收藏0

发表评论

0条评论

Donne

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<