簡體   English   中英

在ExpressJs服務器中導出socket.io變量時出錯

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

我將創建一個數據流,因此當我觸發post route時, get route獲取新數據。

所以我正在使用Socket.io來做到這一點。

首先,將io變量從server.js導出到Nouvproj.js

在我的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");
});

然后在我的路由中導入變量。 並使用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;

然后我得到這個錯誤

TypeError: Cannot read property 'sockets' of undefined

因此Nouvproj.js無法獲取變量的內容,因此我可以在此文件中使用socket.io。

更新 :我已經按照您的描述更新了我的文件,但出現此錯誤:

return fn.apply(this, arguments);
          ^

TypeError: Cannot read property 'apply' of undefined

要導出套接字模塊時,始終會得到未定義的套接字。

你可以這樣做

供您使用,您可以使用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;

您可以像這樣通過io:

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文件

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