【问题标题】:Socket.io inside Node.js backend routesNode.js 后端路由中的 Socket.io
【发布时间】:2017-09-11 12:02:00
【问题描述】:

好的。所以我试图实现在我所有的快速路线中获取 socket.io。

我的代码的一部分:

var port = process.env.PORT || 3000;        // set our port
var server  = app.listen(port);
var  io = require('socket.io')(server);
app.io = io;
exports.io = io;

然后我在其他文件中按如下方式调用它。

var app = require('../../server');
var io = app.io;

function hijack(user,boatid) {
    console.log("????");
    console.log(user);
    app.io.sockets.emit("myevent",{ test: 22});
    var userid = user._id;
console.log(user);


}

module.exports = {

    hijack : hijack(app),


};

但是,现在劫持函数中的用户参数似乎被应用程序占用了,并且,如果我添加了一个额外的参数,它仍然不知道用户参数,因为我在主文件中通过以下方式调用:

var ships_model = require('./app/gamemodels/ship_model.js');

      ships_model.hijack(req.user, req.body.id).then(function (result) {

                res.json(result);
            });

请注意:我尝试像下面这样注入 IO:

var ships_model = require('./app/gamemodels/ship_model.js')(io);

但这只会产生错误。

另一个例子:

是否可以在某些函数中进行套接字发出调用?我只对向客户端发送数据感兴趣。

或者推送服务器端是如何工作的,这也可以用套接字来完成吗?

客户端请求如下服务器端

var bankfactory = require(path.resolve('./modules/articles/server/factory/user_factory.js'));


 app.post('/api/bank', function (req, res) {
bankfactory.bank_inn(req.user._id,amount).then( function (bankresult) {
                res.json(bankresult);
            });
});

银行工厂:

    exports.bank_inn = bank_inn;


    function bank_inn(playerid,amount) {

if (playerid == 1) {

} else {

    // possible to make a emit call to the client here?
//emit("newevent,datahere)
}

    }

注意二:我已经研究了事件发射器,但没有结果。

那么,我怎样才能在我的快速路由中调用 socket.emit?

附加结构代码:

主文件:

var ships_model = require('./app/gamemodels/ship_model.js');

 ships_model.createShipInterface(req.user._id).then(function (response) {
            res.json(response);
        });

ship_model 文件具有以下结构:

module.exports = {
    getShips: getShips(),
    createShipInterface : createShipInterface,
    allowedLocationsShips : allowedLocationsShips,
    startMissionInterface : startMissionInterface,
    deligateShipMovements: deligateShipMovements,
    upgradeBoat : upgradeBoat,
    deletedBoats: deletedBoats,
    hijackSession : hijackSession,
    boats_to_hijack : boats_to_hijack,
    avaliable_boats : avaliable_boats,
    createHijackSession : createHijackSession,
    public_hijack : public_hijack,
    joinHijackSession : joinHijackSession,
    leavehijack : leavehijack,
    sendMessageToMembers : sendMessageToMembers,
    KickMember : KickMember,
    togglePublic : togglePublic,
    getHangar : getHangar,
    hijack : hijack(app),
    getHangarSession: getHangarSession,
    updateUserLocation : updateUserLocation,

};

【问题讨论】:

  • 你需要将socket连接建立单独分开,现在很多代码都在同一个文件JSbin

标签: javascript node.js sockets express socket.io


【解决方案1】:

根据您的评论

那么,我怎样才能在我的快速路由中调用 socket.emit?

在我们的项目中,我们所做的是创建一个socket server和express server。因此 express server(server-socket) 和 browser(client-socket) 都是 socket server 的客户端。

因此,每当 express 服务器想要向浏览器发送内容时,它都会使用我们要发送的浏览器标识符(socket-Id 或客户端套接字的其他唯一标识符)向套接字服务器发送数据。然后使用标识符的套接字服务器将数据发送到特定的浏览器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2018-10-06
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多