在API客户端中公开Expressjs中间件

时间:2015-09-12 15:36:53

标签: javascript node.js express

我正在研究一种采用这种简单形式的Nodejs API客户端:

//client.js
function Client (appId, token) {

    if (!(this instanceof Client)) {
        return new Client(appId, token);
    }

    this._appId = appId;
    this._token = token;
    ...
}

Client.prototype.save = function (data,callback) {
    return this_request(...);
}

Client.prototype._request = function (method, url, data, callback) {
    //do stuff
}

module.exports = Client

我现在想在Expressjs路由中使用auth函数作为中间件,但我不确定如何将该函数集成到client.js

var myModule = require('myModule');
var thingy = myModule("12345", 'abcde');

router.get('/protectedRoute', thingy.auth, function(req, res, next){

}

例如,应该将函数定义为prototype的一部分,如下所示:

Client.prototype.auth = function(req,res,next) {
    //do stuff
}

任何指针和建议都非常赞赏。

1 个答案:

答案 0 :(得分:0)

因此中间件的实现方式是,您必须为其传递函数,然后使用req resnext进行调用。当您采用OOP方法并使auth成为对象的原型方法时,当通过express调用该函数时,它将具有不同的this范围,因此可能会抛出错误。您需要使用bind创建一个将特定范围绑定到该函数的函数,然后将其传递给express。

router.get('/protectedRoute', thingy.auth.bind(thingy), function(req, res, next){

}

可替换地:

var authMiddleware = function(req, res, next) {
  thingy.auth(req,  res, next);
}

router.get('/protectedRoute', authMiddleware, function(req, res, next){

}