如何在Express中间件和端点之间共享信息?

时间:2018-03-29 10:28:56

标签: javascript node.js express middleware

许多中间件都带有工厂,需要一个选项对象。其中的选项通常是需要向中间件提供一些必要信息的功能。例如,请查看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构建内容时,这是一个非常常见的问题。处理这种情况的推荐方法是什么?

1 个答案:

答案 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
});