gpt4 book ai didi

javascript - 使 socket.io 在 Node.js 中的 API 端点内工作

转载 作者:行者123 更新时间:2023-11-30 06:15:50 24 4
gpt4 key购买 nike

我有以下逻辑(所有服务器都在 Node.js 中):

1- 客户端对服务器 A 的“api/request”端点进行 API 调用。

2- 服务器 A“请求”端点接收请求,并通过 socket.io 发出事件将原始请求传递给服务器 B。

3- 服务器 B socket.io on event 接收请求,处理它,并在新的 socket.io emit 事件中发回响应。

4- 服务器事件上的 socket.io 收到响应,并且应该将响应返回给最初发出请求的客户端。

问题是,由于在服务器 A 中我通过 socket.io emit 事件传递请求,我失去了等待服务器 B 的回答以返回给客户端任何东西的选项。我希望客户端收到来自服务器 B 的响应,作为其对服务器 A 的原始调用的响应。

关于如何实现这一点有什么想法吗?

最佳答案

我找到了一个方法。由于您的代码中只能有一个 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');。这是我在服务器 A 代码中所做的:

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

routes/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;

};

像这样,服务器 A 仅在收到服务器 B 的响应后才将响应发送回客户端。

解决了!

关于javascript - 使 socket.io 在 Node.js 中的 API 端点内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56219098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com