express框架中res.redirect()重定向之后,后面的代码还会执行吗?
发布于 6 年前 作者 dreamsline 4674 次浏览 来自 问答

就是我在看别人写的代码里面有return res.redirect()也有res.redierect()有点困惑这个方法的使用。

7 回复

会执行 return res.redirect() 是因为后面没有要执行的代码了所以加上了return 等价于

  res.redirect();
  return;

上面基本上说的差不多了,我补充下。 res.redierect只是结束了一次http请求,但这个方法没有结束,所以如果要结束方法,则需要加一个return来结束这个方法的运行。 而且语言设计上也不会实现一个super的return来实现结束父方法的运行,这样会使得方法管理特别混乱。

https://github.com/expressjs/express/blob/master/lib/response.js#L947 redirect方法最终调用了this.end(),这里的this,根据 https://github.com/expressjs/express/blob/master/lib/response.js#L42 可以看出来是个http.ServerResponse,那么去Node官方文档去看 https://nodejs.org/api/http.html#http_response_end_data_encoding_callback 这个里面说其实是会完成Stream的关闭,另外 https://nodejs.org/api/http.html#http_class_http_serverresponse 也说了ServerResponse实际上是继承自Stream的,那么 https://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback end方法被调用会标记终止写入,这时候客户端就可以拿到response的数据了。

从JS语法上来说,当前function内的代码会从上往下顺序执行,只有当代码执行完或执行return指令的时候才会跳出当前function,调用res.redierect()的时候,如果前面没有加return或下面还有其他代码,那么JS就会继续执行下去,直到执行完所有当前function内可执行的代码,跳出。

return是右结合指令,执行顺序是从右往左执行,所以return res.redirect()是先执行的res.redirect(),然后再执行的return。

再举个栗子: return console.log(1)||res.redirect(); return是右结合,所以先执行右边console.log(1)|||res.redirect() 而||是左结合,所以先执行||左边的,即console.log(1),这时候console会输出1; 然后执行res.redirect(),这时候关闭HTTP Response流,返回结果给客户端; 最后执行return,跳出function。

回到顶部