【问题标题】:why am I getting favicon.ico when i am using findOne method for express params routes?当我使用 findOne 方法来表达参数路由时,为什么我会得到 favicon.ico?
【发布时间】:2022-04-10 04:37:54
【问题描述】:

当我使用 list.save() 方法时,除了 customList 名称之外的对象 favicon.ico 也是 在以下 cod 中保存为记录,为什么我将 favicon.ico 作为对象。

app.get('/:listRoute',function (req,res) {

    const customList=(req.params.listRoute);
    List.findOne({name:customList }, function (err,result) {
        if (!err) {
            if (!result) {
                const list=new List({
                    name: customList,
                    items: defaultItems
                })
                list.save();
            } else {
                console.log(result);

                res.render('list', {
                    listTitle: result.name,
                    latestItems: result.items})
            }
            } 

    });
    })

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    当您访问一个网站(该网站上的任何 URL)时,浏览器通常还会向同一域发送/favicon.ico 的请求,因此请查看该网站是否提供了一个图标来作为该网站的可视化表示。

    由于您使用的是通配符顶级路由:

    app.get('/:listRoute', ...)
    

    这将受到/favicon.ico 的请求的影响。您可能还需要注意被请求的其他一些 URL:/robots.txt/humans.txt/sitemap.xml/ads.txt


    有很多方法可以解决这个问题:

    1. 您的通配符路由可以先检查req.urlreq.params.listRoute,看看它是否应该忽略。

    2. 您可以将其他顶级路由放在通配符路由之前的位置,这样它们就不会出现在这个路由中。

    3. 不要使用顶级通配符路由。相反,请使用 /list/:listRoute 之类的东西,这样它就不会自动匹配任何顶级 http 请求。您对顶级通配符路由的使用会干扰您网站的其他未来使用,并且当您想要将其他顶级路由添加到您的网站时,可以创建向后兼容性。想象一下,如果将来某个时候,您想添加/contact/login/logout。这些都与/:listRoute冲突。

    【讨论】:

      【解决方案2】:

      尝试在list.save()中添加回调函数; 让我知道这个是否奏效。原因可能是因为同步问题。例如:mongoDB 更新第一个文档和保存所用的时间 > 'Get' 方法重定向到自身所用的时间。因此,通过添加此回调,可以确保首先保存代码并在重定向之前检查错误。

      例如:

      list.save(function(err){
          if(!err) {
          console.log("list is successfully saved"); //log is optional
          res.redirect("/" + listRoute);
         }
        });
      

      【讨论】:

        【解决方案3】:

        当使用带有express的参数获取路由数据时,我们可以轻松记录输入的数据。但是如果不添加顶级路由而只是尝试获取所需的路由,例如:

        app.get("/:requireddata",function(req,res){
        
        const data = req.params.requireddata;
        
        });
        

        在这种情况下,加载主页时会生成 favicon.ico。 所以为了得到一个准确的结果,那就是当只加载所需的数据路由时,我们可以通过使用更高级别的路由来得到结果。 如果没有更高级别的路由,只需在 requireddata 之前添加一个额外的路由,如下所示:

        app.get("/add/:requireddata",function(){});
        

        这里 /add/ 是避免 favicon.ico 的附加路径

        对我来说这很有效,所以如果这些信息有用,那就去吧。

        【讨论】:

          【解决方案4】:

          嘿,我也遇到了这个确切的问题。 所以这是我的解决方案。 只需将所有内容都包含在 if 块中,然后就可以了。完成!!!!

          app.get("/:name", function (req, res) {
          if (req.params.name != "favicon.ico") {
          const name = _.capitalize(req.params.name);
          
          List.findOne({ name: name }, (err, foundList) => {
            if (!err) {
              //new list with default items created
              if (!foundList) {
                const list = new List({
                  name: name,
                  items: defaultItems,
                });
                list.save();
                res.redirect("/" + name);
              } else {
                res.render("list", {
                  listTitle: foundList.name,
                  newListItem: foundList.items,
                });
              }
            }
          });
          }
          });
          

          P.s.:- 它会从 mongo 抛出一些错误,但这不会影响整体工作。

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-26
            • 2016-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-28
            • 1970-01-01
            相关资源
            最近更新 更多