Node项目集成Socket.io:等待API响应后再向客户端emit数据
问题解决:等待API完成后通过Socket.io发送数据
核心问题分析
retrieveProjectDetails未返回Promise:原函数内部调用了异步的getProject(),但没有返回Promise链,导致外部无法等待API调用完成。- Socket.io的
emit用法错误:你错误地将回调函数作为emit的第二个参数,正确用法是直接传入要发送的数据。
修复步骤
1. 修改index.js,让函数返回Promise
确保retrieveProjectDetails返回异步操作的Promise,这样外部可以通过await或.then()等待结果:
const getProject = () => { return apiRoot.get().execute(); }; // Retrieve Project information and output the result to the log const retrieveProjectDetails = () => { // 返回Promise链,允许外部等待异步完成 return getProject() .then(response => { console.log(response); return response; }) .catch(error => { console.error(error); // 抛出错误,让调用方可以捕获处理 throw error; }); }
2. 修改server.js,等待API完成后再发送数据
将Socket事件处理函数改为async,使用await等待API调用结果,完成后再执行emit:
import { retrieveProjectDetails } from '../index.js'; io.on('connection', (socket) => { console.log('server: a user connected'); // 事件处理函数改为async,支持await语法 socket.on('getProjectDetails', async (data) => { console.log('server: getProjectDetails: ' + data); try { // 等待API调用完成,获取返回数据 const responseData = await retrieveProjectDetails(); console.log(`server: data: ${responseData}`); // API完成后,向客户端发送数据 io.emit('sendProjectDetails', responseData); } catch (error) { // 可选:向客户端发送错误信息 io.emit('projectDetailsError', error.message); console.error('Failed to retrieve project details:', error); } }); socket.on('disconnect', () => { console.log('server: user disconnected'); }); }); app.listen(PORT, () => console.log(`Listening on: ${PORT}`));
3. 可选:客户端添加错误处理(client.js)
如果需要处理API调用失败的情况,可以新增错误监听:
const getProjectDetails = document.querySelector('.getProjectDetails'); const details = document.querySelector('.details'); getProjectDetails.addEventListener('click', (event) => { const target = new Date(); socket.emit('getProjectDetails', target); }); socket.on('sendProjectDetails', (data) => { details.textContent = JSON.stringify('received: ' + JSON.stringify(data), null, 4); console.log('client: sendProjectDetails was sent from the server'); console.log(data); }); // 新增错误监听 socket.on('projectDetailsError', (errorMsg) => { details.textContent = 'Error: ' + errorMsg; console.error('client: Failed to get project details:', errorMsg); });
内容的提问来源于stack exchange,提问作者lharby
相关产品推荐
相关产品推荐

