当我使用 findOne 方法作为快速参数路由时,为什么我会得到 favicon.ico?

wal*_*ers 2 mongodb node.js express

当我使用 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})
            }
            } 

    });
    })
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 6

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

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

app.get('/:listRoute', ...)
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

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