【问题标题】:REST Post API - retrieve result from TinyURL methodREST Post API - 从 TinyURL 方法检索结果
【发布时间】:2021-06-19 21:21:42
【问题描述】:

我未能在 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)
})

【问题讨论】:

    标签: node.js express rest tinyurl


    【解决方案1】:

    您正在混合 async/await 和回调。不要那样做。 tinyurl library 提供了 shorten 方法的 Promise 版本。我们可以直接使用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
      })
    
    })
    

    编辑 如果您使用回调,请注意callback hell。这是人们更喜欢 async/await 的主要原因之一。

    【讨论】:

    • 我编辑了我的答案 :) 希望你会在链接中找到有趣的东西
    • 这太棒了!谢谢!我知道“等待”是为了让 TinyURL 完成它的过程。但是为什么在这种情况下你需要它才能工作呢?我会查看您提供的异步/回调链接
    • 我只是按照文档进行操作。 shorten 是一个异步函数,所以我们需要使用 await 来等待它完成。看源码的话,调用https://tinyurl.com/的API来做,网络请求是异步的。
    • 我在 TinyURL 文档中看不到“等待”。它确实在缩短方法中显示回调函数。这是你的意思吗?很酷,我不知道你可以用“await”替换回调函数。对吗?
    • 不不,它们是不同的两件事。如果方法提供 Promise 版本,则只能使用 async/await。 async/await 只是编写基于 Promise 代码的糖语法。在npm页面,可以看到// Promise Example部分
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多