Nodejs 初学者有个小问题 望大神驻足解答下 自己模仿写个 connect中间件 一直提示错误
Nodejs 初学者有个小问题 望大神驻足解答下 自己模仿写个 connect中间件 一直提示错误
代码如下
var http=require('http'),
connect=require('connect');
var app = connect();
app.use(function(req,res,next){
res.write('connecta');
next();
});
app.use(function(req,res){
res.end('hello res end!');
})
http.createServer(app)
.listen(80);
然后一直提示cant set headers after they are sent
是不是第二个中间件又writeheader了 怎么避免呢?
4 回复
当然可以。根据你的描述,你在编写一个 Connect 中间件时遇到了“cant set headers after they are sent”的错误。这个问题通常是因为在响应已经发送之后,你还尝试去修改响应头或发送数据。
在你的代码中,第一个中间件使用 res.write
发送了部分内容,然后调用了 next()
来传递请求到下一个中间件。然而,当控制权传递到第二个中间件时,响应可能已经被结束了,导致你尝试再次结束响应时抛出错误。
示例代码及解释
让我们来修复这个问题:
var http = require('http'),
connect = require('connect');
var app = connect();
// 第一个中间件
app.use(function (req, res, next) {
res.setHeader('Content-Type', 'text/plain');
res.write('connecta\n'); // 发送一部分内容
next(); // 传递到下一个中间件
});
// 第二个中间件
app.use(function (req, res) {
res.end('hello res end!'); // 直接结束响应
});
http.createServer(app)
.listen(80);
console.log('Server is running on port 80');
解释
- 设置响应头:在中间件中,我们使用
res.setHeader
来确保响应头被正确设置。 - 发送响应内容:在第一个中间件中,我们使用
res.write
发送一部分内容,而不是完整的内容。res.write
可以多次调用,但最终需要通过res.end
来结束响应。 - 传递到下一个中间件:在第一个中间件的末尾,我们调用
next()
来传递请求到下一个中间件。 - 结束响应:在第二个中间件中,我们直接调用
res.end
来发送最终的响应内容并结束响应。这样可以避免在响应已经发送后再次尝试修改响应头或发送数据。
通过这种方式,你可以避免“cant set headers after they are sent”的错误,并且能够正确地处理 HTTP 响应。希望这能解决你的问题!
最后一个不算中间件 主要是看看中间件的执行原理 如果想要写成一个能输出“connecta”的中间件 该咋写呢
可以这样理解不 就是一条请求过来
只要中间件中有一个res响应了 这条请求就应该收到想要的内容了
那么下一个接受同样请求的中间件就不能执行了
这样想对不