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

Node.js HTTP请求处理中如何正确返回Promise实际结果

问题原因

GetSignedMessage()是async声明的异步函数,直接调用时会立刻返回一个Promise对象,不会阻塞后续代码执行。你在调用后没有等待Promise执行完成、拿到实际resolve的字符串结果,就直接把Promise对象和普通字符串拼接,JS会自动将对象转成[object Promise]字符串输出,就出现了你看到的返回结果。

修复方案

推荐用async/await写法,逻辑更直观,只需要两处修改:

  • 将http.createServer的请求处理回调标记为async函数
  • 调用GetSignedMessage()时加await关键字,等待异步执行完成拿到实际签名字符串再拼接响应

修正后的完整代码:

var http = require('http')

async function GetSignedMessage() {
  return someSigningFunction(secret); // 返回Promise<string>类型结果
}

var server = http.createServer(async function(req, res) {
  if (req.method === "GET") {
    try {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      var message = 'It works!';
      var message2 = await GetSignedMessage(); // 等待异步签名方法返回实际字符串
      var response = [message, message2].join('\n');
      res.end(response);
    } catch (err) {
      // 异常兜底,避免签名失败时请求挂死
      res.writeHead(500, {'Content-Type': 'text/plain'});
      res.end('sign failed');
    }
   }
});

server.listen();

如果不想用async/await,也可以用Promise链式调用的.then()写法,在拿到异步结果的回调里再返回响应:

var http = require('http')

async function GetSignedMessage() {
  return someSigningFunction(secret);
}

var server = http.createServer(function(req, res) {
  if (req.method === "GET") {
    GetSignedMessage()
      .then(message2 => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        var message = 'It works!';
        var response = [message, message2].join('\n');
        res.end(response);
      })
      .catch(err => {
        res.writeHead(500, {'Content-Type': 'text/plain'});
        res.end('sign failed');
      })
   }
});

server.listen();
注意事项
  • Node.js中所有异步API返回的Promise对象,都必须通过await或者.then()的方式拿到最终结果,不能直接将Promise对象作为业务值使用
  • 异步逻辑必须加异常捕获,否则接口报错时请求会一直挂起直到超时,未捕获的Promise异常还可能导致服务进程退出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:15:42