简体   繁体   English

在ExpressJs服务器中导出socket.io变量时出错

[英]Error when exporting socket.io variable in ExpressJs server

I would create a data stream , so when I trigger post route , get route fetch new data. 我将创建一个数据流,因此当我触发post route时, get route获取新数据。

So I'm using Socket.io to do that . 所以我正在使用Socket.io来做到这一点。

first I have a problem when exporting io variable from server.js to Nouvproj.js 首先,将io变量从server.js导出到Nouvproj.js

in my server.js file : 在我的server.js文件中:

   // server.js

// BASE SETUP
// =============================================================================

// call the packages we need
var express = require("express"); // call express
var app = express();
var bodyParser = require("body-parser");
var port = process.env.PORT || 8081; // set our port
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Credentials", "true");
  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();
});
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get("/", function(req, res) {
  res.sendFile(__dirname + "../src/index.html");
});
var server = app.listen(port);

var io = require("socket.io").listen(server);

// define our app using express
var routerProj = require("./routes/ajoutProj")(io);
app.use("/api/proj", routerProj);

var mongoose = require("mongoose");

mongoose.Promise = global.Promise;

mongoose.connect("mongodb://localhost:27017", {
  useMongoClient: true

  /* other options */
}); // connect to our database

mongoose.connection.on("error", function(error) {
  console.log("error", error);
});

// Chargement de socket.io

// Quand un client se connecte, on le note dans la console

// START THE SERVER
// =============================================================================
io.sockets.on("connection", function(socket) {
  console.log("socket");
});

then in my rooutes I import the variable . 然后在我的路由中导入变量。 and use emit and on function to create the stream. 并使用emiton函数创建流。

// ROUTES FOR OUR API
var express = require("express"); // call express
var NouvProj = require("../app/models/nouvProj");
var mongoose = require("mongoose");
var Soc = require("../server");
var io = Soc.io;
var router = express.Router(); // get an instance of the express Router

router.use(function(req, res, next) {
  // do logging
  console.log("Something is happening.");
  next(); // make sure we go to the next routes and don't stop here
});

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)

module.exports = function(io) {
  router
  .route("/projets")

  // create a nouvProj (accessed at POST http://localhost:8080/api/nouvProjs)
  .post(function(req, res) {
    var nouvProj = new NouvProj();
    // create a new instance of the nouvProj model

    nouvProj.nomProj = req.body.nomProj;
    nouvProj.leadProj = req.body.leadProj;
    nouvProj.descProj = req.body.descProj;
    nouvProj.BesProj = req.body.BesProj;
    nouvProj.pers = req.body.pers;
    nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
    nouvProj.backlog.userStory = req.body.UserStory;

    // save the nouvProj and check for errors
    nouvProj.save(function(err) {
      if (err) {
        res.send(err);
        console.log("err");
      }
      res.json({
        message: "nouvProj created!"
      });
      io.sockets.emit("added", function() {
        console.log("Un projet est ajouté !");
      });
    });
  })

  .get(function(req, res) {
    NouvProj.find(function(err, nouvProjs) {
      if (err) res.send(err);
      else {
        io.sockets.on("added", function() {
          res.json(nouvProjs);
        });
      }
    });
  });

router.get("/", function(req, res) {
  res.json({
    message: "hooray! welcome to our api!"
    });
  });
}
// more routes for our API will happen here

module.exports = router;

Then I get this error 然后我得到这个错误

TypeError: Cannot read property 'sockets' of undefined

so Nouvproj.js is not getting the content of the variable so that I could work with socket.io in this file. 因此Nouvproj.js无法获取变量的内容,因此我可以在此文件中使用socket.io。

Update : I have updated my files as you described now I'm having this error : 更新 :我已经按照您的描述更新了我的文件,但出现此错误:

return fn.apply(this, arguments);
          ^

TypeError: Cannot read property 'apply' of undefined

You always get undefined socket when you want exported socket module. 要导出套接字模块时,始终会得到未定义的套接字。

You can do this issue like this 你可以这样做

for your use, you can use process core module of nodejs here is link 供您使用,您可以使用nodejs的流程核心模块,这里是链接

// ROUTES FOR OUR API
var express = require("express"); // call express
var NouvProj = require("../app/models/nouvProj");
var mongoose = require("mongoose");

var router = express.Router(); // get an instance of the express Router

router.use(function(req, res, next) {
  // do logging
  console.log("Something is happening.");
  next(); // make sure we go to the next routes and don't stop here
});

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router
  .route("/projets")

  // create a nouvProj (accessed at POST http://localhost:8080/api/nouvProjs)
  .post(function(req, res) {
    var nouvProj = new NouvProj();
    // create a new instance of the nouvProj model

    nouvProj.nomProj = req.body.nomProj;
    nouvProj.leadProj = req.body.leadProj;
    nouvProj.descProj = req.body.descProj;
    nouvProj.BesProj = req.body.BesProj;
    nouvProj.pers = req.body.pers;
    nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
    nouvProj.backlog.userStory = req.body.UserStory;
// ROUTES FOR OUR API
var express = require("express"); // call express
var NouvProj = require("../app/models/nouvProj");
var mongoose = require("mongoose");
var Soc = require("../server");
var io = Soc.io;
var router = express.Router(); // get an instance of the express Router

router.use(function(req, res, next) {
  // do logging
  console.log("Something is happening.");
  next(); // make sure we go to the next routes and don't stop here
});

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router
  .route("/projets")

  // create a nouvProj (accessed at POST http://localhost:8080/api/nouvProjs)
  .post(function(req, res) {
    var nouvProj = new NouvProj();
    // create a new instance of the nouvProj model

    nouvProj.nomProj = req.body.nomProj;
    nouvProj.leadProj = req.body.leadProj;
    nouvProj.descProj = req.body.descProj;
    nouvProj.BesProj = req.body.BesProj;
    nouvProj.pers = req.body.pers;
    nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
    nouvProj.backlog.userStory = req.body.UserStory;

    // save the nouvProj and check for errors
    nouvProj.save(function(err) {
      if (err) {
        res.send(err);
        console.log("err");
      }
      res.json({
        message: "nouvProj created!"
      });
      process.emit("added", function() {
        console.log("Un projet est ajouté !");
      });
    });
  })

  .get(function(req, res) {
    NouvProj.find(function(err, nouvProjs) {
      if (err) res.send(err);
      else {
        process.on("added", function() {
          res.json(nouvProjs);
        });
      }
    });
  });

router.get("/", function(req, res) {
  res.json({
    message: "hooray! welcome to our api!"
  });
});

// more routes for our API will happen here

module.exports = router;
    // save the nouvProj and check for errors
    nouvProj.save(function(err) {
      if (err) {
        res.send(err);
        console.log("err");
      }
      res.json({
        message: "nouvProj created!"
      });
      process.emit("added", function() {
        console.log("Un projet est ajouté !");
      });
    });
  })

  .get(function(req, res) {
    NouvProj.find(function(err, nouvProjs) {
      if (err) res.send(err);
      else {
        process.on("added", function() {
          res.json(nouvProjs);
        });
      }
    });
  });

router.get("/", function(req, res) {
  res.json({
    message: "hooray! welcome to our api!"
  });
});

// more routes for our API will happen here

module.exports = router;

You can pass io like this: 您可以像这样通过io:

projects.js -file projects.js-文件

var express = require("express");
var router = express.Router();

module.exports = function (io) {
    router.get('/something', ..., function (req, res) {
        io.sockets.on('connection', function (socket) {
           ... do something
        })
    })
}

server.js -file server.js文件

var express = require("express"); // call express
var app = express();
var bodyParser = require("body-parser");
...
...

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

var projects = require('./routes/projects')(io);
app.use('/projects', projects);
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM