res.render() 和 next(),不经意间犯得一个小错误
发布于 10 年前 作者 struCoder 8538 次浏览 最后一次编辑是 8 年前

直接进入主题吧,不去啰嗦了 我在我的routes.js中是这么写的app.get('/stu/bacic',auth.checkLogin,stuBasicInfo.getBasicInfo); 就是先验证是否登录,之后才跳转,原本这是一个很容易的事情,可我还是遇到一个小问题 思考片刻后就解决了。 ####什么问题呢?#### 我在auth.js中是这么写的:

exports.checkLogin = function(req,res,next){
	if(!req.session.user){
		res.render('notify',{
			title:'登录提示',
			error:'您还未登录,请登录!'
		});
	}
	next();
}

聪明的你已经发现,这里有个很明显的错误,那么这个错误会有怎么样的表现呢?我调试的时候打开对应的url,发现浏览器 一直在进行加载的状态,我又点击其他的连接,毫无任何的反应,之后我又仔细的看了上面的那几行代码, 当时就觉的node在我点击对应的url时,代码执行到res.render(),之后又向下迅速执行next(),就这样,我的notify还没有渲染,就已经执行了next()。所以浏览器一直忙啊~~~,这时如果打开其他的url,是不成功的。 因为我在开发阶段,所以直接把res.render()全部注释了,这样就okay了,如果正式开发的话, 解决方法就是在res.render()前加一个return ! :)

6 回复

嗯嗯。这种少了 return 的小错误,在 if (err) {next(err)} 中也很容易出现。

嗯,是的。小错误不能再犯 :)

也可以使用if-else做法

这是为什么啊

@alsotang 新手尤其容易遇到这个错误,express报过不少 Can’t set headers after they are sent- -

@Eclipse-xp 出现错误,处理掉,不然执行完错误处理,又继续执行“正确”的逻辑…

回到顶部