如何使用Express API发送10x响应?

我正在实施早期的信息反馈。 这是我试图用来优化h2o的推送响应function的function(Ctrl + F用于服务器推送) 。

我正在寻找一个理智的快速API,以便像这样提前刷新100个响应:

HTTP/1.1 100 Continue Link: </assets/layout.css>; rel=preload; as=style ... HTTP/1.1 200 OK .... 

但是很遗憾无法find它。 我还查找了适当的Node Response API,但我唯一能find的就是复制粘贴节点的writeContinue内部解决scheme,如下所示:

 const common = require('_http_common') const { CRLF } = common let links = [] // fill up links const earlyResponse = 'HTTP/1.1 100 Continue' + CRLF + links.map(link => `Link: ${link}`).join(CRLF) + CRLF + CRLF res._writeRaw(earlyResponse, 'ascii', () => { res.status(200)send("blabla") }) 

这种感觉很脏,因为_writeRaw似乎是私有API,所以我想知道在那里注入早期响应的最_writeRaw的方法。

这是在103代码标准化的过程中 ,所以了解如何实现这一点很重要。

(请参阅下面的更新以将自定义标题添加到100 Continue

如果请求中有Expect: 100-continue头,则Express会自动发送100 Continue

看例子:

 const app = require('express')(); app.get('/', (req, res) => { console.log('xxx'); res.json({ xxx: 1 }); }); app.listen(4433); 

并发送请求:

 $ echo -ne 'GET / HTTP/1.1\r\nExpect: 100-continue\r\n\r\n' | nc localhost 4433 HTTP/1.1 100 Continue HTTP/1.1 200 OK X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 9 ETag: W/"9-8rjb3nqDuC81Vbxmadwj3RqLz9Y" Date: Wed, 19 Jul 2017 11:21:47 GMT Connection: keep-alive {"xxx":1} 

正如你所看到的那样:

 HTTP/1.1 100 Continue 

即使在Express应用程序中没有做特殊的configuration,也会出现在响应中。

您也可以通过以下方式显式发送Continue

 res.writeContinue(); 

但是添加自定义标题可能很困难 – 请参阅此问题:

  • function请求:将标题传递给response.writeContinue()#7588(已closures)

更新

这里是上面的例子更新有点hacky,但我认为唯一的方法,使其工作 – 感谢罗伯特·Klep张贴在评论:

 const app = require('express')(); app.get('/', (req, res) => { console.log('xxx'); res.json({ xxx: 1 }); }); let server = app.listen(4433); server.on('checkContinue', (req, res) => { res._writeRaw('HTTP/1.1 100 Continue\r\nFoo: bar\r\n\r\n'); res._sent100 = true; server.emit('request', req, res); }); 

现在的答复是:

 $ echo -ne 'GET / HTTP/1.1\r\nExpect: 100-continue\r\n\r\n' | nc localhost 4433 HTTP/1.1 100 Continue Foo: bar HTTP/1.1 200 OK X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 9 ETag: W/"9-8rjb3nqDuC81Vbxmadwj3RqLz9Y" Date: Wed, 19 Jul 2017 12:17:18 GMT Connection: keep-alive {"xxx":1} 

以下是Robert Klep的原创精华: