初学者有个小问题 望大神驻足解答下 自己模仿写个 connect中间件 一直提示错误
发布于 1年前 作者 evaer 582 次浏览

代码如下

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了 怎么避免呢?

15 回复

为啥会在中间件里面来res.end呢

最后一个不算中间件 主要是看看中间件的执行原理 如果想要写成一个能输出“connecta”的中间件 该咋写呢

@evaer 不算中间件为嘛会用app.use()哦?

@thesadboy 不用app.use() res怎么end呢?

@evaer connect没用过,不过用过Express,我试试,呵呵

@thesadboy 我给你点32个赞

@evaer 应该与favicon有关吧。

@evaer 不对,再看看

@thesadboy不着急 早晚能弄明白

@evaer 看其他的中间件的代码似乎都是对req进行处理,没有对res进行什么操作,这块还是有点怪,看源码中,呵呵

在Connect的源码中proto.js中有一段if(!layer || res.headerSent)中在你调用res.write()后这里面就有值了,就会继续执行下去,就会执行到

    else {
        debug('default 404');
        res.statusCode = 404;
        res.setHeader('Content-Type', 'text/plain');
        if ('HEAD' == req.method) return res.end();
        res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));
    }

这里就会出现问题了

可以这样理解不 就是一条请求过来 只要中间件中有一个res响应了 这条请求就应该收到想要的内容了
那么下一个接受同样请求的中间件就不能执行了 这样想对不

@evaer 应该可以这么说吧,你可以看看proto.js中的有关与 next的源码。

@thesadboy 谢谢大神啊 大神天天开心 过年愉快

@evaer 额……我不是什么大神哦,不用谢哦,呵呵,都愉快。

回到顶部