gpt4 book ai didi

javascript - 为什么 NodeJS/restify 服务器*很少*在接受时报告 EPERM?

转载 作者:可可西里 更新时间:2023-11-01 17:34:21 29 4
gpt4 key购买 nike

我在 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。我的长期计划是升级到最新的稳定版本,但我们可能几个月都无法更新。

最佳答案

让我在这里留下我的解决方案,以防其他人将来遇到同样的问题。

从技术上讲,我没有发现为什么会发生此错误,但我确实找到了如何成功处理错误情况:陷阱和释放。该错误必须在应用程序级别被捕获,因为它是在我的源代码的任何 try-catch 上下文之外的 net.js 深处生成的。因此,如果我不捕获它,它就会使我的应用程序崩溃。但该错误不是 fatal error ,似乎可以安全地忽略它。在测试中,即使发生此错误,套接字仍继续接收新连接。

process.on("uncaughtException", onUncaughtException );
function onUncaughtException(error) {
// put some code here to log the error occurrence, then ...
if( error.code==="EPERM" && error.syscall==="accept" ) {
// non-fatal error: do nothing; just ignore this error
}
else {
// handle other application errors here
}
}

因此,虽然了解为什么服务器套接字偶尔会出现 EPERM 错误可能仍然很有趣,但现在我很满意知道在错误发生时处理错误的正确方法。 p>

关于javascript - 为什么 NodeJS/restify 服务器*很少*在接受时报告 EPERM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36203564/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com