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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将sockets.io从快速服务器文件传递到路由文件相关的知识,希望对你有一定的参考价值。

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

我正在使用这个答案中提到的方法: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不起作用。

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

答案

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

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

var returnRouter = function (client) {

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

    ...
};

以上是关于将sockets.io从快速服务器文件传递到路由文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有新服务器请求的情况下将下载的图像从父路由传递到子路由

将变量从刀片传递到路由并从那里传递到另一条路由

如何将数据从 laravel 传递到 Vue Router?

具有通过护照实例的快速路由中的路由分离

将快照数据从一个 dart 文件传递​​到颤振项目中的另一个文件

Laravel 将 url 参数从控制器传递到路由