You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Nodemon避免重启包含Puppeteer的指定代码逻辑

解决方案

方案1:配置Nodemon忽略规则(减少不必要的重启触发)

如果你的WhatsApp客户端初始化逻辑本身很少修改,可以先把这部分代码单独拆分到独立文件,再配置Nodemon忽略该文件的改动,避免误触发重启:

  1. 拆分WhatsApp初始化逻辑到lib/whatsapp-client.js:
// lib/whatsapp-client.js
const { Client } = require("whatsapp-web.js");
const client = new Client({ puppeteer: { headless: false } });
client.initialize();

module.exports = client;
  1. 根目录新增nodemon.json配置,添加忽略规则,同时加入Puppeteer会话缓存、临时文件到忽略列表:
{
  "ignore": [
    "lib/whatsapp-client.js",
    "*.session.json",
    "node_modules/"
  ]
}

注意:这个方案只能减少不必要的重启触发,如果你修改了其他业务代码导致Nodemon全量重启进程,还是会重新初始化client实例,需要彻底避免重启重建client请用方案2或3。

方案2:进程隔离(最彻底的解决方式)

把WhatsApp客户端服务和Express Web服务拆成两个独立的运行进程,二者互不影响:

  1. 单独编写whatsapp-service.js作为常驻服务,只负责处理WhatsApp相关逻辑,不需要用Nodemon启动,手动启动后保持后台运行即可,可以在这个服务里暴露本地HTTP接口和Web服务通信:
// whatsapp-service.js
const express = require("express");
const app = express();
app.use(express.json());
const { Client } = require("whatsapp-web.js");

const client = new Client({ puppeteer: { headless: false } });
client.initialize();

// 暴露给Web服务调用的示例接口
app.post("/send-message", async (req, res) => {
  const { number, text } = req.body;
  try {
    await client.sendMessage(number, text);
    res.send({ status: "success" });
  } catch (err) {
    res.status(500).send({ status: "fail", error: err.message });
  }
});

// 仅监听本地端口,不对外暴露
app.listen(3001, () => console.log("WhatsApp服务运行在端口3001"));
  1. 原有的Web服务只负责业务逻辑,用Nodemon启动,需要调用WhatsApp能力时直接请求本地3001端口的接口即可,Web服务重启完全不会影响WhatsApp服务的运行。

方案3:使用模块热重载替代全量重启

如果不想拆分进程,可以替换Nodemon的全量重启逻辑,改用热重载工具只重载修改的业务模块,顶层的client实例不会被重新初始化:
比如把所有路由逻辑都放到单独的routes/目录下,用require-reload模块动态加载路由:

const express = require("express");
const app = express();
const http = require("http");
const server = http.createServer(app);
const reload = require("require-reload")(require);
const { Client } = require("whatsapp-web.js");

// 顶层初始化逻辑,进程运行期间只会执行一次
const client = new Client({ puppeteer: { headless: false } });
client.initialize();

// 动态加载路由,修改路由文件时不需要重启整个进程
app.use((req, res, next) => {
  const routes = reload("./routes");
  routes(req, res, next);
});

server.listen(3000, () => {
  console.log("listening on *:3000");
});

内容的提问来源于stack exchange,提问作者Azeem Haider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:08