我正在尝试将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;
};
当我调用route
this.io
属性返回undefined
时,有人知道这是什么问题吗? 最佳答案
这里的问题是对范围在JavaScript中如何工作的误解。当router
调用messageController.sendMessageAction
时,它将使用绑定。例如:
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)
)