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
相关产品推荐
相关产品推荐

