我正在尝试将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)
)

10-06 00:49