node.js和mongoose查询中的异步编程问题

mftmpeh8  于 2023-08-06  发布在  Go
关注(0)|答案(1)|浏览(113)

我目前正在为后端和API课程做来自www.example.com的URL缩短器项目freecodecamp.org。我对这段代码有一些问题:

app.post('/api/shorturl', async (req, res, next) => {

  let url = req.body.url;
  let urlObj;

  try {

    urlObj = new URL(req.body.url);

  } catch (err) {

    req.err = err;
    return next();

  }

  let hostname = urlObj.hostname;

  try {

    console.log("TENTATIVO URL " + url);
    const address = await dns.promises.lookup(hostname);
    saveUrl(url).then(() => {
      console.log("url " + url);
      Url.findOne({ url: url }).exec().then(
        (data) => {
          console.log(data);
          console.log(data.get('shortUrl'));
          res.json({ original_url: url, short_url: data.get('shortUrl') });
        }
      );

    });

  } catch (err) {

    req.err = err;
    next();

  }
},
  (req, res) => {
    console.log(req.err);
    res.json({ error: 'Invalid URL' });
  });

字符串
当我尝试console.logUrl.findOne查询结果时,有时会显示shortUrl字段,有时则不会。所有文档都正确保存在MongoDB数据库中,我只是不明白为什么有时查询部分失败。
下面是日志的一个示例:


的数据
下面是保存在MongoDB数据库中的文档:



下面是saveUrl的定义:

const saveUrl = async (originalUrl) => {

  let u = new Url(
    {
      url: originalUrl
    }
  );

  u.save();

};

oxosxuxt

oxosxuxt1#

在saveUrl函数中,你不返回u.save(),所以你以这种方式悬挂一个promise,这就是为什么有时你会看到结果,有时不会,你不等待执行完成。

const saveUrl = async (originalUrl) => {

 let u = new Url(
   {
     url: originalUrl
   }
 );

 return u.save();

};

字符串
或者更简洁的方式,因为如果你不使用await,就不需要async函数。

const saveUrl = (url) => new Url({url}).save()


对您的原始代码进行了一些调整

app.post('/api/shorturl', async (req, res, next) => {
  try {
    const original_url = req.body.url
    const urlObj = new URL(original_url)

    const { hostname } = urlObj
    console.log('TENTATIVO URL ' + url)
    const address = await dns.promises.lookup(hostname)
    const url = await saveUrl(req.body.url)  

    console.log('url ' + url)
    const data = await Url.findOne({ url: url }).exec()
    console.log(data)
    const short_url = data.get('shortUrl')
    console.log(short_url)

    return res.json({ original_url, short_url })
  } catch (err) {
   req.err = err
   next()
  }
 },
(req, res) => {
  console.log(req.err)
  res.json({ error: 'Invalid URL' })
  },
)

相关问题