【问题标题】:res.render() calls promise twice expressjsres.render() 两次调用promise expressjs
【发布时间】:2020-09-23 23:48:25
【问题描述】:

您好,我还是 Nodejs 和 MongoDB 的初学者。当我运行如下所示的 res.render() 函数时,我得到 2 个控制台日志,第一个是来自 mongodb find 查询的正确结果,第二个是 null。如果我删除 res.render() 它仅适用于一个 console.log() 输出而不是第二个 null。

router.get('/:areaslug', (req, res) => {
    // Query results
    let areavar = {}     

    return client.db("AwesomeApartments")
                 .collection("areas")
                 .findOne({slug: req.params.areaslug
    })
    .then((datadb) => {
      // first time shows correct results next it shows null
      console.log(" bug-testing : "+JSON.stringify(datadb));

      //storing result of first query to my object
      areavar = datadb; 

      return client.db("AwesomeApartments")
                   .collection("apartments")
                   .find({area:datadb._id})
                   .toArray()
      })
      .then((apartmentdb) => {
        // Storing results of second query
        areavar.apartments = apartmentdb; 

        //removing this solves the issue
        return res.render('area',areavar); 

       }).catch(err =>       
       {
         console.log(err);

         return;
       })
    }); 

【问题讨论】:

  • 我建议您将console.log(req.url) 添加到您的代码中,您可以看到到底发生了什么。一种猜测(如果这是顶级路由器)是当浏览器向您的服务器询问网站图标时,您收到了对/favicon.ico 的请求。 IMO,出于这个原因以及其他一些原因,您永远不应该拥有这样的通配符顶级路线。
  • 您的代码中有一些严重的错误。您必须先了解基础知识。您仍然没有完全掌握如何使用 return 语句。不幸的是,我无法回答您的问题,因为我认为必须先有人接受它。但我建议你多学习一些关于 node/javascript 的基础知识,然后再学习。
  • @jfriend00 谢谢!遵循您的建议后,我发现浏览器正在请求 favicon.ico
  • 仅供参考,这只是顶级通配符路由通常是个坏主意的原因之一。如果您的 slug 命名空间与站点命名空间发生冲突/重叠,它真的会阻碍任何未来的发展。它们都可以是顶级的,但您应该设计 slug,以便它们与您可能希望用于您的网站的顶级 URL 名称(例如 favicon.ico 或在您的网站展示中使用的其他名称)是唯一的。跨度>

标签: node.js mongodb express es6-promise


【解决方案1】:

对于那些在这里找到方式的人来说,浏览器正在生成两个获取请求。第一个用于查询,第二个用于 favicon.ico。处理 favicon.ico 请求解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2021-06-13
    • 2014-04-07
    • 2018-01-16
    相关资源
    最近更新 更多