将参数传递给expressjs中的中间件函数

时间:2018-06-22 13:44:43

标签: node.js express

我正在尝试向nodejs添加缓存功能。

我想要这样的代码

app.get('/basement/:id', cache, (req,res) =>  {
   client.set('basement' + req.params.id,'hello:'+req.params.id)
   res.send('success from source');
});


function cache(req,res,next) {
    console.log('Inside mycache:' + req.params.id);
    client.get('basement' + req.params.id, function (error, result) {
        if (error) {
            console.log(error);
            throw error;
        } else {
            if(result !== null && result !== '') {
                console.log('IN  Cache, fetching from cache and returning it');
                console.log('Result:' + result);
                res.send('success from cache');

            } else {
                console.log('Not in Cache, so trying to fetch from source ');;
                next();
            }
        }
    });
}

我想对 / basement /:id 路由收到的请求应用名为 cache 的中间件功能。

缓存功能将接收密钥作为其参数。 在缓存内部,我想检查缓存是否存在,如果是,则从那里返回它,否则,我想调用实际的路由处理程序。该密钥基于一个或多个请求参数。

这样,我最终将为应用程序中的每个处理程序编写一个单独的缓存功能。

我的缓存功能内部的逻辑是对该键的一般期望,该键基于实际的请求对象,并且因方法而异。

因此,我想拥有一个通用的缓存功能,该功能可以将键作为参数,这样我就可以拥有这样的代码

app.get('/basement/:id', cache, (req,res) =>  {
    client.set('basement' + req.params.id,'hello:'+req.params.id)
    res.send('sucess from source');
});

我的意思是我将把缓存键传递给缓存功能。因此,缓存功能可以是通用的。

但是,如果我更改如下的缓存功能以接收缓存键,则它将无法正常工作。

function cache(cachekey,req,res,next) {

}

似乎我的缓存函数中无法包含另一个参数来接收传递的参数。

我想将缓存键作为参数传递给函数。

如果有人遇到过类似的问题,请您帮我一下。

1 个答案:

答案 0 :(得分:2)

  

但是,如果我更改如下所示的缓存功能,以便接收   缓存键,它不起作用。

您不能这样做,因为它不是有效的Express中间件,Express会依次通过:reqresnext。和errreqresnext用于错误中间件。

您的缓存function将需要返回一个中间件,因此您可以向其传递密钥。

  

我想创建一个通用缓存功能,可以使用任何缓存   键。在这种情况下,它是id,但其他情况下可能具有不同的密钥

function cache(key, prefix = '') {

    // Or arrange the parameters as you wish to suits your needs
    // The important thing here is to return an express middleware
    const cacheKey = prefix + req.params[key];
    return (req, res, next) => {

        console.log('Inside mycache:' + cacheKey);
        client.get(cacheKey , function(error, result) {
            if (error) {
                console.log(error);
                return next(error); // Must be an error object
            }

            if (result !== null && result !== '') {
                console.log('IN  Cache, fetching from cache and returning it');
                console.log('Result:' + result);
                return res.send('success from cache');

            }

            console.log('Not in Cache, so trying to fetch from source ');;
            next();

        });

    }
}

现在您可以像这样使用它:

app.get('/basement/:id', cache('id', 'basement'), (req, res) => { /* ... */ });
app.get('/other/:foo', cache('foo', 'other'), (req, res) => { /* ... */ });