2016-11-15 63 views
2

我想分享socket.io到我的财产,不知道为什么它不工作...原型模式创建新的属性

我的第一个文件,MessageController.js

function MessageController() { 
}; 

MessageController.prototype.io = ""; 

MessageController.prototype.sendMessageAction = function (req, res) { 
    console.log(this.io); 

} 

module.exports = new MessageController(); 

在另一个文件router.js我有像这样:

var messageController = require('./controllers/MessageController'); 


module.exports = function (expressApp, router, io) { 
    console.log(io); 

    messageController.io = io; 

    router.post('/dashboard/message', messageController.sendMessageAction); 

    return router; 
}; 

这里是我需要router.js

module.exports = function (expressApp, io) { 
    var router = system.express.Router(); 

    router = require('./dashboard/router.js')(expressApp, router, io); 

    return router; 


}; 

而当我呼叫路线this.io财产返回undefined任何人都知道什么是问题?

+0

它看起来像你可能它router.js 尝试被设置为undefined : module.exports =功能(expressApp,路由器,IO){ 的console.log(IO); // undefined .... }; –

+0

这不是bacause udefined,我取代'io'用字符串,但同样的结果... – Vladimir

+0

你router.js 设置之前,取而代之的是你尝试登录它,就像我建议? –

回答

1

这里的问题是关于范围如何在JavaScript中工作的误解。当router调用messageController.sendMessageAction时,它使用绑定。 e.g:

callback(res, req, next) 

在这种情况下,电流范围不是messageController。所以this不是指messageController。如果你想this绑定messageController你必须绑定sendMessageAction它。

// Using Function#bind 
router.post(
    '/dashboard/message', 
    messageController.sendMessageAction.bind(messageController) 
) 

// Using a closure 
router.post(
    '/dashboard/message', 
    (req, res) => messageController.sendMessageAction(req, res) 
) 
+0

那么这里是谁呢? 路由器? 因为这个方法被删除了吗? –