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" : "*"
}
Nodejs发布Cloudfoundry的一个报错排查,求助
大家好,最近在Cloudfoundry上部署一个基于Node.js的服务时遇到了一个问题,希望有经验的大牛们能帮忙解答。
报错信息
在查看日志文件/logs/stderr.log
时,发现如下错误信息:
====> /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)
背景信息
我在本地开发环境中使用的是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);
在这个示例中,我们监听了finish
和close
事件,确保在响应结束后不再进行任何操作。
版本兼容性
另外,如果你在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"
}
}
希望这些信息对你有所帮助!如果有其他解决方案或建议,欢迎分享。