如何让Node服务实现自动重启

简介: 如何让Node服务实现自动重启

当我们在做Node服务端开发的时候通常都会监听一个启动的端口来进行通信,当服务的内容发生改变的时候总是需要重新启动服务来保证服务内容可以被页面或接口正确获取,当重启的次数变的多了以后往往就会考虑到自动重启来解决这种重复的劳动,如:nodemon。那么我们就来探索一下要实现一个类似nodemon的功能。


前提概要:



1. 涉及知识点:

  1. fs.watch,fs.watchFile,chokidar;
  2. child_process,spawn


2. 任务拆解:

  1. 监听文件的改变;
  2. 自动重启服务。


监听文件的改变:



在node的fs包下提供watch和watchFile两个API可以来实现文件和内容变化的监听,但是在nodemon的依赖配置中有这么一个依赖chokidar,通过查看chokidar的说明文档得知

如下信息: Node.js fs.watch:

  • 在 MacOS 上不报告文件名。
  • 在 MacOS 上使用 Sublime 等编辑器时根本不报告事件。
  • 重复报告事件。
  • 将大多数更改作为rename。
  • 不提供递归监听文件树的简单方法。
  • 不支持在 Linux 上递归监听。


Node.js fs.watchFile:

  • 在事件处理方面不完美。
  • 不提供任何递归监听。
  • 导致 CPU 使用率高。


我们可以通过chokidar提供的第一个代码片段来实现今天的功能:

const chokidar = require('chokidar');
// One-liner for current directory
chokidar.watch('.').on('all', (event, path) => {
  console.log(event, path);
});
复制代码


自动重启服务:


我们的node服务通常都是通过命令来执行入口文件,所以我们这里就需要使用node中child_process包下的spawn来操作我们的命令,spawn的参数分别是:1.执行的命令,2.命令附带的参数,3.将子进程io对接到父进行进行输出:

function startServer() {
  let childProcess = spawn("node", ["index.js"], {
    stdio: [process.stdin, process.stdout, process.stderr],
  });
  console.log("[ starting ] >", `${childProcess}node .index.js`);
}
复制代码


完整的代码实现:


// watch.js
const chokidar = require("chokidar");
const { spawn } = require("child_process");
let childProcess;
const debounceStartServer = debounce(startServer, 1000);
chokidar.watch(["./index.js"]).on("all", (event, path) => {
  childProcess && childProcess.kill();
  debounceStartServer();
});
function startServer() {
  console.log("[ starting ] >", "node .index.js");
  childProcess = spawn("node", ["index.js"], {
    stdio: [process.stdin, process.stdout, process.stderr],
  });
}
function debounce(fun, wait = 200) {
  let timer;
  return function () {
    const context = this;
    const args = arguments;
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fun.apply(context, args);
    }, wait);
  };
}
// index.js
const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
  ctx.body = "hi Koa";
});
app.listen(3000);



相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
4月前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
63 5
|
4月前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
7月前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
3月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
48 0
Node服务连接Mysql数据库
|
4月前
|
监控 JavaScript 前端开发
深入浅出Node.js: 打造高效的后端服务
【8月更文挑战第27天】在这个数字化飞速发展的时代,后端技术成为支撑互联网服务的基石。Node.js作为其中的佼佼者,以其非阻塞I/O模型、事件驱动架构和丰富的生态系统,赢得了开发者的青睐。本文将带领读者深入理解Node.js的核心概念,通过实际案例分析其应用模式,并探讨如何利用Node.js构建高效、可扩展的后端服务。无论你是初学者还是有经验的开发者,都能在这篇文章中找到提升你的Node.js技能的灵感和知识。
|
4月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的深度整合
【8月更文挑战第27天】 在现代Web开发中,后端服务的高效性至关重要。本文深入探讨了如何利用Node.js的非阻塞I/O特性和Express框架的简洁性来打造高性能的后端服务。我们将通过具体案例,展示如何在不牺牲代码可读性和可维护性的前提下,实现高效的请求处理和服务端逻辑。文章旨在为开发者提供一个清晰的指导,帮助他们在构建后端服务时做出更明智的技术选择。
|
4月前
|
存储 缓存 JavaScript
构建高效后端服务:Node.js与Express框架的实战应用
【8月更文挑战第2天】在数字化时代的浪潮中,后端服务的构建成为了软件开发的核心。本文将深入探讨如何利用Node.js和Express框架搭建一个高效、可扩展的后端服务。我们将通过实际代码示例,展示从零开始创建一个RESTful API的全过程,包括路由设置、中间件使用以及数据库连接等关键步骤。此外,文章还将触及性能优化和安全性考量,旨在为读者提供一套完整的后端开发解决方案。让我们一同走进Node.js和Express的世界,探索它们如何助力现代Web应用的开发。
|
4月前
|
弹性计算 JavaScript 中间件
构建高效后端服务:使用Node.js和Express框架
【8月更文挑战第4天】本文将通过一个实际案例,详细介绍如何使用Node.js和Express框架快速构建一个高效、可扩展的后端服务。我们将从项目初始化开始,逐步实现RESTful API接口,并介绍如何利用中间件优化请求处理流程。最后,我们将展示如何部署应用到云服务器上,确保其高可用性和可扩展性。
|
4月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js: 打造高效后端服务
【8月更文挑战第27天】Node.js作为一款强大的后端开发平台,以其非阻塞I/O和事件驱动的特性深受开发者喜爱。本篇文章将引导你从基础到进阶,探索Node.js的核心技术与应用实践,让你能够利用这一技术构建高效、可扩展的后端服务。文章不仅包含理论知识,还会通过实际代码示例加深理解,让学习过程既系统又富有趣味。
下一篇
DataWorks