许多中间件都带有工厂,需要一个选项对象。其中的选项通常是需要向中间件提供一些必要信息的功能。例如,请查看express-preconditions:
app.use(preconditions({
stateAsync: async (req) => { // Fetch the date the resource was last modified. }}
});
这是一个简洁的模式,但我发现当多个地方需要相同的信息时它会变得复杂。例如,假设我有一个数据库表,其中包含有关响应应包含的资源的信息以及上次修改日期。换句话说,中间件和端点本身都需要相同的信息。我最终得到的代码类似于:
//The middleware
app.use(preconditions({
stateAsync: async (req) => {
const data = await fetchFromDb(req.param("id"));
return {
lastModified: data.lastModified
};
})
//The endpoint
app.use("path", (req, res, next) => {
const data = await fetchFromDb(req.param("id"));
res.send(data);
});
因为我需要在不同的地方使用相同的信息,所以我两次访问数据库。我当然可以只获取一次,或将其存储在请求对象的某个位置。但这感觉有点像黑客。另一个解决方案是在fetchFromDb
中使用某种缓存机制,但这感觉有点过于复杂。
根据我的经验,在使用Express构建内容时,这是一个非常常见的问题。处理这种情况的推荐方法是什么?
答案 0 :(得分:1)
您可以使用res.locals
:
app.get('/yourEndPoint', (req, res, next) => {
const data = // fetch your datas;
res.locals.lastModified = data.lastModified;
next();
}, (req, res) => {
const lastModified = res.locals.lastModified;
// do whatever you need to do
});