【发布时间】:2016-07-12 05:49:44
【问题描述】:
我正在 NodeJS 中运行一个 restify 服务器。在极少数情况下,大约 0.05% 的 HTTPS 请求会导致 net.js 报告以下错误:
Error: accept EPERM
at exports._errnoException (util.js:742:11)
at TCP.onconnection (net.js:1280:24)
HTTP 请求没有什么特别之处。在报告此错误之前,服务器可能已经服务了数千个请求,甚至响应了数十个相同的请求。我找不到任何关于为什么服务器可能会为已成功接受连接数小时的套接字生成 EPERM 错误的任何信息。
顺便说一句,这个错误发生在我们源代码的任何执行上下文之外。因此,EPERM 并不是关于我们的代码访问文件或执行其他一些系统调用。当新请求到达并且在我们的代码被调用之前,EPERM 正在 NodeJS TCP 代码的深处发生。
起初,当错误发生时,它会导致 NodeJS 终止。然后我添加了代码来捕获应用程序级异常:
process.on("uncaughtException", onUncaughtException );
但是由于我不知道为什么会发生这个错误,所以完全不清楚恢复过程是什么。
不确定是否重要,但这里是与启动 restify 服务相关的大部分代码:
var restify = require("restify");
// skipping some other init code
// configuration data is read from a JSON file
var serverOptions = {
name: configuration.server.name,
version: configuration.server.version,
formatters: {
"application/json": jsonResponseFormatter,
"text/html": textResponseFormatter
},
serverOptions.key: fs.readFileSync(configuration.server.sslKey),
serverOptions.cert: fs.readFileSync(configuration.server.sslCert)
}
var server = restify.createServer( serverOptions );
// skipping middleware inits and URL registrations
server.listen(
configuration.server.port, // using HTTPS 443
configuration.server.serverip );
顺便说一句,我们正在运行旧版本的 NodeJS:v0.11.13。我的长期计划是升级到最新的稳定版本,但我们可能要几个月才能更新。
【问题讨论】:
-
当我让 Nodemon 读取包含它无法处理的文件的文件夹时,我遇到了 EPERM 错误。您最近是否将任何文件或文件夹添加到您的主服务器文件夹?
-
@WouldBe 否,此 EPERM 错误与任何类型的文件系统访问无关。当 HTTP 请求传入时,TCP/IP 套接字上报告错误。
标签: javascript node.js http error-handling