简体   繁体   中英

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.

So I'm using Socket.io to do that .

first I have a problem when exporting io variable from server.js to Nouvproj.js

in my server.js file :

   // 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.

// 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.

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

// 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:

projects.js -file

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

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);
...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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