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

如何将Promise返回值输出到http.createServer并在页面显示?

解决HTTP页面无法显示异步getGasPrice返回值的问题

问题原因

  • 响应提前结束:你在调用getGasPrice().then(...)之后立刻执行了res.end(),而getGasPrice是异步操作,此时then里的res.write(value)还没执行,响应就已经结束了,浏览器收不到后续写入的内容。
  • getGasPrice函数写法错误:web3.eth.getGasPrice如果传入回调函数,不会返回Promise,所以你的await完全不起作用,函数会直接返回初始值'0',后续回调修改gasPrice的操作是在函数返回之后才执行的,这也是导致逻辑混乱的原因。

修复方案

1. 修正getGasPrice函数

改用web3.eth.getGasPrice的Promise形式(不需要回调),让await真正生效:

async function getGasPrice() {
  try {
    // 直接await Promise形式的调用,无需回调
    const gasPrice = await web3.eth.getGasPrice();
    return gasPrice;
  } catch (error) {
    console.error('获取Gas价格失败:', error);
    return '获取失败';
  }
}

2. 修正HTTP服务器逻辑

把res.end()放到异步操作完成后的回调里,确保内容写入后再结束响应;或者在服务器回调里用async/await让代码更清晰:

方式一:使用async/await

http.createServer(async (req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  
  // 用await等待异步结果,再写入并结束响应
  const gasPrice = await getGasPrice();
  res.write(gasPrice);
  res.end();
}).listen(2000, '127.0.0.1');

方式二:使用then链式调用

http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  
  getGasPrice().then((value) => {
    res.write(value);
    res.end(); // 写入后再结束响应
  }).catch(error => {
    res.write('获取Gas价格失败');
    res.end();
  });
}).listen(2000, '127.0.0.1');

关键说明

  • 必须确保res.end()在所有内容写入完成后执行,因为res.end()会告诉服务器响应已经完成,不能再写入任何内容。
  • 加入try/catch可以处理获取Gas价格时的异常,避免服务器崩溃或无响应。

内容的提问来源于stack exchange,提问作者ION

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:32:32