node.js - REST Post API - 从 TinyURL 方法检索结果
问题描述
我未能在 POST 方法中从 TinyURL 获得结果并将其分配给“short_url”以进行响应。console.log(short_url) 将显示“Promise { pending }”。我尝试使用 async / await 函数来检索 TinyURL 结果,但我确定我没有正确使用它。
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')
})
app.post('/api/shorturl', (req, res) => {
let original_url = req.body.url
console.log(original_url) // this one shows correct URL from request body
async function createShortURL(url) {
await TinyURL.shorten(url, function(res) {
console.log(res) // this one shows correct shortened URL
}
)}
let short_url = createShortURL(original_url)
console.log(short_url) // this one shows "Promise { <pending> }"
res.json({
original_url : original_url,
short_url : short_url
})
})
var listener = app.listen(process.env.PORT || 3000, function () {
console.log('Your app is listening on port ' + listener.address().port)
})
解决方案
您正在混合 async/await 和回调。不要那样做。tinyurl 库提供了 Promise 版本的shorten
方法。我们可以直接使用 async/await。
app.post('/api/shorturl', async (req, res) => {
let original_url = req.body.url
console.log(original_url) // this one shows correct URL from request body
// just this
let short_url = await TinyURL.shorten(url);
console.log(short_url)
res.json({
original_url : original_url,
short_url : short_url
})
})
编辑 如果您使用回调,请注意回调地狱。这是人们更喜欢 async/await 的主要原因之一。