一个关于我似乎无法正常工作的简单问题......
我在一个名为limiter.js
的单独文件中处理我的API的基本速率限制器。我希望每个调用都能通过限制器运行,因此我将其包含在server.js
文件中。
我正在使用Redis存储请求,所以我也需要传递redis的引用。
//server.js
var limiter = require('./limiter')(app,redisClient);
app.use(limiter.check());
如何将req
和res
提供给文件。
在我的limiter.js
文件中,我有:
module.exports = function (app, redisClient) {
var limiter = {};
limiter.check = function (req, res) {
console.log(req) //ERROR: req object does not exist
var ts = moment().unix();
var ip = req.connection.remoteAddress;
var key = ip + ":" + ts;
...
};
return limiter;
};
但req
对象不存在
答案 0 :(得分:4)
app.use
方法需要一种方法,但您尝试调用limiter.check
并传递结果。放下额外的parens它应该工作。
答案 1 :(得分:3)
您需要传递对方法的引用,而不是调用它。
app.use(limiter.check);
如果您想继续使用它,那么您需要返回一个函数。
limiter.check = function () {
return function(req, res, next) {
var ts = moment().unix();
var ip = req.connection.remoteAddress;
var key = ip + ":" + ts;
...
next();
}
};
PS:不要忘记拨打next()
,否则它将无法通过您的中间件堆栈继续进行并将挂起。