一个奇怪的bug,关于express的路由。
发布于 8 年前 作者 muyuqingqiu 3626 次浏览 来自 问答

最近在学习express,模仿书上做了blog的例子。但是使用这段路由代码会报错:cannot send header after send(大概是这个意思)。我查了一下,有资料说这个bug原因是在send或者reditrct之后又设置header信息了。但是我查了一下所有send或者redirect之后都return了,不知道为何还会出现这个问题。恳请大家帮我答疑解惑 。 //这是设置路由的代码 module.exports = function(app) { app.use(function(req,res,next){ res.locals.showTests = app.get(‘env’) !== ‘production’ && req.query.test === ‘1’; next(); }) app.get(’/’, function(req, res) { return res.redirect(’/posts’); }); app.use(’/signup’, require(’./signup’)); app.use(’/signin’, require(’./signin’)); app.use(’/signout’, require(’./signout’)); app.use(’/posts’, require(’./posts’)); //下面两个处理异常的路由一加上就报错,不加就不报错 //404 catch-all 处理器 app.use(function(req, res, next) { res.status(404); res.render(‘404’); return; }) //500 错误中间件 app.use(function(err,req, res, next) { console.log(err.stack); res.status(500); res.render(‘500’); return; }) }; //处理posts页的路由 router.get(’/’,function(req,res,next){ var author = req.query.author; console.log(req.ip); PostModel.getPosts(author) .then(function(posts){ res.render(‘posts’,{ posts: posts, title: ‘主页’, pageTestScript: ‘qa/tests-posts.js’ }); }) .catch(next);

})QQ图片20161125154330.png 这是请求posts页面后的报错

13 回复

我看了下你发出来的代码貌似没啥问题

@hyj1991 我也是这么觉得的啊,但是就是报错。。

没有人帮看看么?

加 log 看代码执行, 肯定是重复 res.send 了

你在路由的代码里写的是next(),还是next(‘errMsg’)呢?

来自酷炫的 CNodeMD

所有send或者redirect之后都return了

试试 res.end() 呢

@heartstrings22 路由里没写next

这个问题是一加捕获404或者500的路由代码就会出现。不加这两个就没报错。

@fireswork ?什么东西undefined

额。。不好意思,我自己在用react重构cnode,这个是测试。。。

服务器端发送了http content body之后,就不能setHeader了. 看错误应该是 在res.send或res.end的之后进行了res.setHeader操作了。

回到顶部