Nodejs发布cloudfoundry的一个报错排查,求助

Nodejs发布cloudfoundry的一个报错排查,求助

有同学在cloudfoundry上使用nodejs发布服务的吗,今天我在折腾的时候报错了

====> /logs/stderr.log <====
events.js:66
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: Cannot write after end
at Gzip.write (zlib.js:307:31)
at ServerResponse.module.exports.res.write (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/compress.js:86:18)
at ServerResponse.module.exports.res.end (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/compress.js:91:23)
at res.end (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/session.js:286:13)
at /var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:73:11
at process.startup.processNextTick.process._tickCallback (node.js:244:9)

====> /logs/stdout.log <====

nodejs用的0.8.2版本,以为是版本的问题,后来本地也该为这个版本但没问题,线上发布成功,但是在访问的时候就报上面的错误,看日志应该是express中的compress引用zlib的问题。各位大牛有遇到类似的问题么,才学nodejs,新手入门

另在用cloudfoundry配置的时候遇到版本不一致的,可以用vmc push --runtime=node08指定版本
哦,忘了自己采用的express最新版本 package.json

"dependencies" : {
	"express" : "*",
	"ejs" : "0.8.3",
	"mongoose": "*",
	"connect-flash" : "*",
	"view-helpers" : "*"
} 

2 回复

Nodejs发布Cloudfoundry的一个报错排查,求助

大家好,最近在Cloudfoundry上部署一个基于Node.js的服务时遇到了一个问题,希望有经验的大牛们能帮忙解答。

报错信息

在查看日志文件/logs/stderr.log时,发现如下错误信息:

====&gt; /logs/stderr.log &lt;====
events.js:66
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: Cannot write after end
at Gzip.write (zlib.js:307:31)
at ServerResponse.module.exports.res.write (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/compress.js:86:18)
at ServerResponse.module.exports.res.end (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/compress.js:91:23)
at res.end (/var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/session.js:286:13)
at /var/vcap/data/dea/apps/nodepp-0-1dbb7d00985754c9a1cc92e23d2adf73/app/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:73:11
at process.startup.processNextTick.process._tickCallback (node.js:244:9)

背景信息

我在本地开发环境中使用的是Node.js v0.8.2版本,但将应用推送到Cloudfoundry后,在访问应用时出现了上述错误。本地环境测试一切正常。

可能的原因

从错误日志来看,问题似乎与Express框架中compress中间件使用的zlib库有关。在某些情况下,res.end()被多次调用,导致无法写入数据。

解决方案

经过一些调试,我发现可能是因为在响应已经结束的情况下,尝试再次写入数据。以下是一个简单的示例代码,展示如何避免这种情况:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.on('finish', () => {
    console.log('Response has been finished.');
  });
  
  res.on('close', () => {
    console.log('Connection has been closed.');
  });

  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

在这个示例中,我们监听了finishclose事件,确保在响应结束后不再进行任何操作。

版本兼容性

另外,如果你在Cloudfoundry上遇到版本不一致的问题,可以使用vmc push --runtime=node08命令来指定Node.js的运行时版本。同时,更新你的package.json文件,确保依赖项的版本兼容。

{
  "dependencies": {
    "express": "~3.0.0",
    "ejs": "0.8.3",
    "mongoose": "^3.8.8",
    "connect-flash": "^0.1.1",
    "view-helpers": "^0.2.0"
  }
}

希望这些信息对你有所帮助!如果有其他解决方案或建议,欢迎分享。


根据你的描述,错误信息 Error: Cannot write after end 通常出现在尝试在响应已结束时继续写入数据的情况下。这可能是因为在某些情况下,Express 的中间件(如 compresssession)在响应已经完成时仍然尝试写入数据。

这里有几个可能的原因和解决方案:

  1. 检查路由处理函数: 确保在发送完响应后没有再次调用 res.end()res.write()。例如:

    app.get('/somepath', function(req, res) {
        // 发送响应后不要再调用 res.end() 或 res.write()
        res.send('Hello World');
    });
    
  2. 中间件顺序: 确保中间件的加载顺序正确。compress 中间件应该在 session 之前加载。

    var express = require('express');
    var compress = require('compression');
    var session = require('express-session');
    
    var app = express();
    app.use(compress());
    app.use(session({ secret: 'keyboard cat' }));
    
  3. 依赖版本: 确保所有依赖项版本兼容。特别是 express, connect, 和 zlib。你可以考虑固定特定版本来避免潜在的兼容性问题。

    "dependencies": {
        "express": "~3.0.0",  // 确保与项目兼容的版本
        "ejs": "0.8.3",
        "mongoose": "^3.8.3",
        "connect-flash": "^0.1.1",
        "view-helpers": "^0.5.0"
    }
    
  4. Cloud Foundry 版本问题: 你提到在线上环境中使用了不同的 Node.js 版本。确保你的应用在不同环境下的一致性。可以使用 package.json 来明确指定所需的 Node.js 版本。

    "engines": {
        "node": "0.8.x"
    }
    

这些步骤应该能帮助你排查并解决这个问题。如果问题仍然存在,请提供更多的代码细节以便进一步分析。

回到顶部