[英]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. 并使用emit
和on
函数创建流。
// 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.