[英]io.sockets.on not working inside a route in Node.js
我正在嘗試在Node.js和Express應用程序中的路由中使用io.sockets.on。 我一直在關注這里所說的內容: https : //stackoverflow.com/a/31277123/8271839
我可以成功發送io.sockets.emit事件,但我無法通過io.sockets.on接收事件。
這是我的代碼:
index.js:
const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest');
app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);
app.set('socketio', io);
server.listen(4002);
io.sockets.on("connection",function(socket){
console.log("connected");
socket.on("connected", function (data) {
console.log("hello");
})
});
路線/ taskRequest.js:
const express = require('express');
const router = express.Router();
router.post('/', async (req, res) => {
var io = req.app.get('socketio');
//pickedUser is one of the connected client
var pickedUser = "JZLpeA4pBECwbc5IAAAA";
//we only send the emit event to the pickedUser
io.to(pickedUser).emit('taskRequest', req.body);
io.on('connection', function (socket) {
console.log('connected 2');
socket.on('taskResponse', function () {
console.log('hello 2');
});
});
});
module.exports = router;
當客戶端連接時,我在控制台中收到“已連接”消息,但不是“已連接2”消息。
此外,當客戶端發出“已連接”消息時,我在控制台中得到“hello”,但是當客戶端發出“taskResponse”消息時,我在控制台中沒有得到“hello 2”。
雖然當io.to(pickedUser).emit('taskRequest', req.body);
被調用,它工作,客戶端收到“taskRequest”消息。
為什么.emit()在我的路線內工作而不是.on()?
根據您的代碼, io
是附加到http.Server實例的Socket.IO服務器實例,用於偵聽傳入事件。 然后在路由中再次附加一個實例來監聽不起作用的傳入事件。 io.to(pickedUser).emit
有效,因為帶有socketio的服務器實例正在正確地監聽連接,因此給出了console.log(“connected”);.
index.js:
const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest');
app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);
app.set('socketio', io);
server.listen(4002);
路線/ taskRequest.js:
const express = require('express');
const router = express.Router();
router.post('/', async (req, res) => {
var io = req.app.get('socketio');
//pickedUser is one of the connected client
var pickedUser = "JZLpeA4pBECwbc5IAAAA";
io.on('connection', function (socket) {
console.log('connected 2');
io.to(pickedUser).emit('taskRequest', req.body);
socket.on('taskResponse', function () {
console.log('hello 2');
});
});
});
module.exports = router;
我將TRomesh的答案標記為正確的答案,因為你的代碼中確實只能有一個io.on('connection', function (socket) {})
。
現在我正在做的就是讓它適合我:問題是如果你把io.on('connection', function (socket) {})
放在你的router.post('/', async (req, res) => {})
,只有在調用端點時才會觸發。 在我的例子中,我有一些我想在任何時候調用的套接字事件,而不僅僅是在調用端點時。 所以我不得不將io.on('connection', function (socket) {})
放在我的router.post('/', async (req, res) => {})
。 因此我無法使用var io = req.app.get('socketio');
在路由器內部。 以下是我所做的事情:
index.js:
const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest')(io);
app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);
server.listen(4002);
路線/ taskRequest.js
const express = require('express');
const router = express.Router();
module.exports = function(io) {
//we define the variables
var sendResponse = function () {};
io.sockets.on("connection",function(socket){
// Everytime a client logs in, display a connected message
console.log("Server-Client Connected!");
socket.on('connected', function(data) {
//listen to event at anytime (not only when endpoint is called)
//execute some code here
});
socket.on('taskResponse', data => {
//calling a function which is inside the router so we can send a res back
sendResponse(data);
})
});
router.post('/', async (req, res) => {
//pickedUser is one of the connected client
var pickedUser = "JZLpeA4pBECwbc5IAAAA";
io.to(pickedUser).emit('taskRequest', req.body);
sendResponse = function (data) {
return res.status(200).json({"text": "Success", "response": data.data});
}
});
return router;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.