You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node项目集成Socket.io:等待API响应后再向客户端emit数据

问题解决:等待API完成后通过Socket.io发送数据

核心问题分析

  1. retrieveProjectDetails未返回Promise:原函数内部调用了异步的getProject(),但没有返回Promise链,导致外部无法等待API调用完成。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:22:34