Express POST接口调用TinyURL生成短链返回Promise pending问题求助
错误用法说明
- 你给
TinyURL.shorten传了回调函数,这种调用方式下该方法不会返回Promise,await关键字对其不生效,你封装的createShortURLasync函数也没有返回短链结果,执行后只会返回pending状态的Promise。 - 调用
createShortURL时没有加await关键字,直接赋值拿到的是Promise实例,而非异步执行后得到的短链值。 res.json执行时机早于短链生成的异步逻辑,返回的short_url自然是未完成的Promise对象。
正确实现方案
完整可运行代码
var express = require('express') var TinyURL = require('tinyurl') var app = express() app.use(express.json()) app.use(express.static('public')) app.get("/", function (req, res) { res.sendFile(__dirname + '/index.html') }) // 路由处理函数添加async关键字,支持内部使用await app.post('/api/shorturl', async (req, res) => { try { const original_url = req.body.url console.log('原始URL:', original_url) // 不传回调调用TinyURL.shorten会返回Promise,await直接获取短链结果 const short_url = await TinyURL.shorten(original_url) console.log('生成短链:', short_url) res.json({ original_url, short_url }) } catch (error) { // 捕获异常返回错误响应 res.status(500).json({ error: '短链生成失败,请检查输入URL合法性' }) } }) var listener = app.listen(process.env.PORT || 3000, function () { console.log('Your app is listening on port ' + listener.address().port) })
改动说明
- 给POST接口的路由处理函数添加
async关键字,使其支持await语法 - 去掉冗余的自定义封装函数,直接调用
TinyURL.shorten且不传回调,利用其原生支持的Promise返回特性,用await直接拿到短链结果 - 新增try/catch捕获异步操作异常,避免服务崩溃,异常时返回明确的错误响应
- 调整响应执行时机,等短链生成完成后再返回响应数据
内容的提问来源于stack exchange,提问作者trily84
相关产品推荐
相关产品推荐

