Node.js服务监听正常报events:498 访问时nodemon崩溃
问题修复方案
报错根因
node:events:498错误由*单请求重复调用res.end()*触发:Node.js的HTTP响应在调用res.end()后就会完成响应流程、关闭响应流,重复调用会直接抛出未捕获异常导致进程崩溃,nodemon检测到进程退出就会触发重启,该问题和依赖损坏、npm缓存异常无关,重装依赖的操作无法解决问题。
代码逻辑缺陷
现有代码的分支判断没有做互斥,也没有在响应结束后终止逻辑执行:
- 访问根路径
/时,命中第一个if分支执行res.end('Home Page')后,代码会继续向下执行到末尾的res.end('Error Page'),触发二次调用 - 访问
/about路径时,命中第二个if分支执行res.end('About Page')后,同样会继续执行末尾的res.end('Error Page'),触发二次调用
修复后代码
在每个响应分支的res.end()前加return终止函数执行,保证单次请求只会调用一次res.end()即可:
const http = require('http') const server = http.createServer((req, res) => { if (req.url === '/') { return res.end('Home Page') } if (req.url === '/about') { return res.end('About Page') } res.end('Error Page') }) server.listen(5000, () => { console.log('Server listening on port : 5000...') })
也可以改用else if做分支互斥实现相同效果,修改后任意路径的请求都不会再触发重复响应错误,nodemon也不会异常崩溃。
内容的提问来源于stack exchange,提问作者Mohammed Ajaas
相关产品推荐
相关产品推荐

