【问题标题】:Pass sockets.io from express server file to route file将 sockets.io 从快速服务器文件传递到路由文件
【发布时间】:2018-08-10 04:12:40
【问题描述】:

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

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

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

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

我的问题是如何让套接字在一个修复文件中工作?

【问题讨论】:

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


    【解决方案1】:

    您应该将 socket.io 侦听器移到 express use 路由之外。目前还不清楚您为什么希望它在那里,因为每次有人向您的 v1 端点发出请求时,它都会注册一个新的侦听器。

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

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

    【讨论】:

    • 我会在几个小时内测试它,但这就是路由不触发的原因吗?
    猜你喜欢
    • 2017-08-13
    • 2016-06-06
    • 2015-10-07
    • 1970-01-01
    • 2018-04-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多