将sockets.io从快速服务器文件传递到路由文件

问题描述 投票:0回答:1

我会在单独的路由文件中使用套接字。

我正在使用这个答案中提到的方法:Express 4 Routes Using Socket.io

我复制了完全相同的逻辑。在服务器文件中:

var http = require("http");
var admin = require('firebase-admin');
var firebase = require("firebase");
var express = require("express");
var app = express();
var bodyParser = require("body-parser");
var port = process.env.app_port || 8080; // set our port
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

var server = app.listen(port);
var io = require("socket.io")(server);
var routerProj = require("./routes/routes")(io);

app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT ,DELETE');

  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,*");
  next();
});
var config = {
  .... DB Configuration ....
};
firebase.initializeApp(config);

var serviceAccount = require("./ServiceAcountKey.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://datatable-18f93.firebaseio.com"
});
io.on("connection", function (client) {
  console.log("Un client est connecté !");
  //routerProj(client);
});
app.use("/v1", routerProj, function (req) {
  //Create HTTP server and listen on port 8000 for requests

});

我的连接套接字正在运行,console.log在终端中运行

routes.js文件

var express = require("express"); // call express
var router = express.Router(); // get an instance of the express Router
var admin = require("firebase-admin");

var returnRouter = function (client) {

  router.use(function (req, res, next) {
    // do logging
    client.on('save-message', function (socket) { console.log("heheyy") })
  });
  router
    .route("/")
    .get(function (req, res, err) {

      // Get a database reference to our posts
      var db = admin.database();
      var ref = db.ref("/");

      // Attach an asynchronous callback to read the data at our posts reference
      ref.once("value", function (snapshot) {
        var list = [];
        snapshot.forEach(function (elem) {
          list.push(elem.val());
        })
        list = JSON.stringify(list);
        //list = JSON.parse(list)

        console.log(err);
        //console.log(JSON.stringify(list))

        res.send(list);


      }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
        res.status(500).send(errorObject.code);
      });
    });

  router
    .route("/")
    .post(function (req, res, err) {
      console.log(req.body);
      // Get a database reference to our posts
      var db = admin.database();
      var ref = db.ref("/");

      ref.push(
        {
          "text": req.body.text
        }

      );

    });
  return router;
}
module.exports = returnRouter;

当我的arr运行时,在Angular中发出save-message:

  ngOnInit() {
    this.socket.emit('save-message', { room: "hello" });
  }

保存消息事件既没有被读取也没有读取路由文件,在我的角度应用程序服务中没有从路由获取数据。 get和post路由中的console.log不起作用。

我的问题是如何让套接字在单独的文件中工作?

javascript node.js sockets express socket.io
1个回答
0
投票

您应该将socket.io侦听器移动到快速use路由之外。不清楚为什么你会想要它,因为它会在每次有人向你的v1端点发出请求时注册一个新的监听器。

您可能没有看到消息,因为在有人向v1端点发出请求并且客户端已发送其消息之前,侦听器不会注册。

var returnRouter = function (client) {

    // do logging
    client.on('save-message', function (socket) { 
        console.log("heheyy");
    });

    ...
};
© www.soinside.com 2019 - 2024. All rights reserved.