错误:该套接字已关闭。

5

我目前对Node.js还不熟悉。我遇到了以下异常问题。你知道这个异常实际上是什么意思,需要什么解决方案吗..????

Error: This socket is closed. 
    at WriteStream.Socket._write (net.js:635:19) 
    at doWrite (_stream_writable.js:219:10) 
    at writeOrBuffer (_stream_writable.js:209:5) 
    at WriteStream.Writable.write (_stream_writable.js:180:11) 
    at WriteStream.Socket.write (net.js:613:40)       
    at Console.log (/home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/winston/lib/winston/transports/console.js:78:20) 
    at emit (/home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/winston/lib/winston/logger.js:174:17) 
    at /home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/async/lib/async.js:108:13 
    at Array.forEach (native) 
    at _each (/home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/async/lib/async.js:32:24) 
    at Object.async.each (/home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/async/lib/async.js:107:9) 
    at Logger.log (/home/ubuntu/svnrepo/FoodiptoBackend/TransactionManagement/node_modules/winston/lib/winston/logger.js:202:9)

这是我的应用程序中使用的记录器代码。

var winston = require("winston");
var moment = require("moment");

//Note : create directory for logs manually
var logFileName = process.cwd() + '/logs/' + moment().utc().format("YYYYMMDD") +   '.log';

var logger = new (winston.Logger)({
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({
            filename: logFileName,
            handleExceptions: true, //same file shall be used for handling info as well as  exception logs
            json: true,
            maxsize: 5242880,
            timestamp: true
        })
    ],
    exitOnError: false //prevent exit if an uncaught exception occurs
});

//
// Handle errors
//
logger.on('error', function (err) {
    //console.log("Error occured while logging");
});

module.exports = logger;

1
或者找出为什么套接字的另一端正在关闭它。如果没有看到实际代码并了解导致此问题的条件/操作序列,我们就无法做太多事情。 - jfriend00
我认为这个问题出在模块上,因为这个异常是随机发生的。我没有任何迹象表明它是从哪里发生的。 - Ravindra Aghera
另一个困惑是,我的代码在本地机器上运行正常,但每当我将服务部署到服务器上时,它会随机生成异常..?? - Ravindra Aghera
1个回答

0

提到的console.js:78:20实际上调用了process.stderr.write。 接下来我们看到它调用了一个socket:WriteStream.Socket.write (net.js:613:40)

一开始看起来很困惑。为什么process.stderr需要一个socket呢?

嗯,这实际上是node.js中stderr的工作方式,主要的例外是直接输出到文件的stderr

我认为这里发生的事情只是因为你有两个记录器而已,才会出现可见的错误。

  1. 当你的应用程序退出时,它首先断开控制台socket的连接。
  2. 然后它继续写一些日志消息。
  3. 当然,由于socket现在已经断开连接,这些日志语句无法发送到你的控制台,导致出现错误。
  4. 但是,这些语句仍然可以发送到你的文件记录器,因为它稍后关闭。

那么,为什么在关闭socket之后还要继续发送一些日志消息呢? 我不是100%确定。

  • 可能是代码中的某些问题。
  • 可能是由于未捕获的异常处理程序造成的。
  • 可能是由于您的logger.on(...)中的某些内容造成的。
  • 也许您在某个地方使用了logger.stream

无论原因如何,有趣的是自从发表这篇文章以来,代码已经在内部重新编写,不再直接使用process.stderr。也许这只是一个winston bug,现在可能已经解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接