【发布时间】:2023-04-01 05:28:01
【问题描述】:
我有一个要求,我需要为每个 axios 请求设置一个 Request-Id 标头。此标头的值由另一个快速中间件动态生成。
现在我可以做:
axios.get(url, headers: {'Request-Id': req.requestId});
但是我想把这个抽象移到一个通用的地方,这样它就可以在任何地方重复使用。我想出了一个自定义的 express 中间件:
app.use(function (req, res, next) {
req.fetch = axios;
req.fetch.defaults.headers.common['Request-Id'] = req.requestId;
next();
})
现在我可以在任何路由中使用req.fetch 而无需单独设置标题,但这是推荐的方法吗?
如果有人能解释这种方法是否有任何缺陷或更好的解决方案,将会很有帮助。
【问题讨论】:
-
在 javascript 中,对象是通过引用传递的,您现在通过中间件对所有请求使用相同的对象 axios req.fetch.defaults.headers.common[ 'Request-Id'] 将设置为 axios 对象,该对象将被所有请求共同共享,因此您最终可能会将一个的 requsetId 用于另一个。
-
是的。我会确保在其他地方只使用
req.fetch。但是对于上面的问题陈述,我可以使用axios.create()来创建一个特定的实例,这样全局对象就不会被修改了。 -
另外,我想知道 Express 中任何可能的竞争条件,这可能导致错误/陈旧的
Request-Id被传递给路由。
标签: javascript express axios