Hyper运行Node服务app.js报events.js:377错误崩溃,求原因及解决方法
events.js:377错误含义
该错误是Node.js内核事件模块抛出的未捕获错误异常,触发逻辑为:当继承了EventEmitter的实例抛出error事件,但未绑定对应的error事件监听函数时,Node.js会直接终止进程并打印该报错栈。本次报错的触发原因是https.request创建的请求实例抛出了网络/参数错误,没有对应的错误监听逻辑,导致服务启动即崩溃。
当前代码的错误点
- 作用域逻辑错误:https请求相关代码全部写在了
app.post()路由回调的外部,服务启动时会立即执行请求,此时提交的用户信息变量完全未定义,参数非法 - 序列化参数错误:
const jsonData = JSON.stringify("data");是把字符串"data"做序列化,实际需要序列化的是data对象,应该去掉引号 - 请求方法未执行:
requestt.end漏写了调用括号,应该为requestt.end(),否则请求不会被发送 - 缺少错误监听:https请求实例没有绑定error事件回调,一旦请求出错就会触发未捕获异常导致进程崩溃
- 无响应返回:app.post路由处理完成后没有给客户端返回任意响应,会导致用户提交后页面一直加载超时
修复后的app.js代码
const express = require("express"); const https = require("https"); const bodyParser = require("body-parser"); const app = express(); app.use(express.static("public")); app.use(bodyParser.urlencoded({extended: true})); app.get("/", function(req, res){ res.sendFile(__dirname + "/signup.html"); }) app.post("/", function(req, res){ const firstName = req.body.fName; const lastName = req.body.lName; const email = req.body.email; const data = { members:[ { email_address: email, status: "subscribed", merge_fields: { FNAME: firstName, LNAME: lastName } } ] } const jsonData = JSON.stringify(data); const url = "https://us5.api.mailchimp.com/3.0/lists/21760b9a041"; const options = { method: "POST", auth: "你的mailchimp apikey,格式为任意字符串:apiKey,前缀us5要和你apiKey后缀一致" } const requestt = https.request(url, options, function(response) { response.on("data", function(data){ console.log(JSON.parse(data)); // 可以根据返回状态码给用户返回成功/失败页面 if(response.statusCode === 200){ res.send("订阅成功") } else { res.send("订阅失败,请重试") } }) }) // 新增错误监听,捕获请求异常避免崩溃 requestt.on('error', function(e) { console.error('请求出错: ' + e.message); res.send("订阅失败,请稍后再试") }); requestt.write(jsonData); requestt.end(); }); app.listen("3000", function(){ console.log("Server is running on port 3000"); });
通用排查思路
- 所有涉及网络请求、文件IO的异步操作,都必须绑定error事件监听,避免未捕获异常导致进程崩溃
- 检查业务逻辑的代码作用域,确保变量在使用前已经完成初始化
- 校验第三方接口的鉴权信息、参数格式、请求地址是否匹配服务商要求
- 开发阶段可以添加全局未捕获错误监听,兜底捕获异常避免服务直接崩溃:
process.on('uncaughtException', function (err) { console.log('捕获到未处理异常:' + err); });
内容的提问来源于stack exchange,提问作者CodePrin
相关产品推荐
相关产品推荐

