有朋友在学习了我这篇教程后,也想动手用 Custom Middleware 搞一些事情,比如使用代码打印 SAP UI5 应用发送的 HTTP 请求的响应头部字段,即下图红色高亮的内容:
- SAP UI5 应用开发教程之一百八十二 - SAP UI5 Tooling 实战:动手创建自己的 Custom UI5 Server Middleware
这个朋友在 Custom Middleware 的实现代码里,加上了一行 log.info(res.getHeaders())
:
然而最后实际结果,只打印出了三个 HTTP 响应字段:其中有两个,即 access-control-allow-origin
和 log1
,还是我们自己的 Custom Middleware 里刚刚添加的。
这和我们浏览器里看到的相比,也差得太多了吧。造成这个差异的原因,是因为当我们编写的 SAP UI5 Custom Middleware 得到执行的时候
,我们最终在浏览器里看到的其他 HTTP 响应头部字段,还没有被框架填充到 response
对象里,所以此时打印不出来。
解决方案就是,在 Custom Middleware 里再添加一段下列代码:
res.on('finish', () => {
console.log(`request url = ${req.originalUrl}`);
console.log(res.getHeaders());
});
最终完整代码如下图所示:
这段代码是在一个 Express 应用中使用 Node.js 的 res
对象的 on
方法监听 'finish' 事件。当服务器端对 HTTP 请求的处理完全结束,即响应数据已经被发送到客户端时,这个 'finish' 事件会被触发,于是我们在 finish
事件对应的回调函数中,打印响应字段的头部字段,此时就可以打印出所有字段的内容了。
让我们逐行解释这段代码:
res.on('finish', () => {
console.log(`request url = ${req.originalUrl}`);
console.log(res.getHeaders());
});
res.on('finish', ...)
:这一行代码通过on
方法注册了一个 'finish' 事件的监听器。res
对象是 Express 应用中的响应对象,而 'finish' 事件是在响应结束时触发的事件。() => {
:这是箭头函数的语法,定义了 'finish' 事件触发时执行的回调函数。console.log(
request url = ${req.originalUrl});
:这一行代码输出了请求的原始 URL。在 Express 应用中,req
对象表示请求,而originalUrl
属性包含了原始的请求 URL,包括查询参数等信息。console.log(res.getHeaders());
:这一行代码输出了响应头部信息。res
对象的getHeaders
方法返回一个包含所有响应头的对象。这里使用console.log
打印这个对象,显示所有响应头的名称和对应的值。
通过这段代码,我们可以实现,在 SAP UI5 Custom Middleware 里,每次 HTTP 请求完成后,记录请求的原始 URL 和响应头部信息。这个实现可以在启动 SAP UI5 应用的控制台里,打印出原本只能在 Chrome 浏览器开发者工具 Network 面板里看到的信息,对于调试和监控应用程序的网络交互有所帮助。
重新启动 ui5 serve
, 此时就能打印出完整的 HTTP 请求的响应头部字段了: