【问题标题】:How to get only page path in expres.js?如何在 express.js 中仅获取页面路径?
【发布时间】:2021-01-10 16:07:12
【问题描述】:

如何在 express.js 中获取 only 页面路径? 我想基于 url 呈现页面。就像我尝试访问 http://example.com/a_lion包含在对象中找到的数据的文件。如果没有,它将呈现带有“未找到”数据的同一页面。 这是我的index.js文件代码sn-p:

app.get("*",(req,res) => {
  
  if(req.url == "/"){
      res.render("index",{title:"Recent Stories"});
  }else{
    console.log(req.path);
   fs.readFile("stories.json",(err,data) => {
     
     if(err){throw err}
     else{
      
      let actualData = JSON.parse(data.toString());
      let mainData = actualData.find((e) => {
       return e.title === req.url;
      })
      
      if(mainData == undefined){
         res.render("stories",{title:"Ops,",body:"Not found!"});
      }else{
        res.render("stories",{title:mainData.title,body:mainData.body})
      }
     }
     
   });
   
  } 
})

console.log(req.path); 行中,它会输出一些这样的网址:

/a_lion
/favicon.ico

我只想要/a_lion 行而不是其他行,这样我的代码就可以在数组中搜索它。我怎样才能做到这一点?

【问题讨论】:

  • 您要求处理*所有请求。如果您不想处理某些(如网站图标或其他资产),请在您现在拥有的处理程序中有条件地检查它们,或者添加更早的静态处理程序来为它们提供服务。
  • 您会得到两条日志行,因为您处理了两个请求。这些不是从单个req.path 打印出来的。
  • 您应该考虑使用比"*" 更好的路径。例如,如果您使用/story/:name 并链接到/story/a_lion,那么req.params.name 将是a_lion
  • @Chris G hmmm,是的,我应该这样做。

标签: javascript node.js express url


【解决方案1】:

一般来说。你不能。

客户要求一些东西。服务器收到对该事物的请求,并且必须确定它是什么。

大多数浏览器在从新网站加载页面时会要求在(例如)选项卡中显示网站图标。这是正常行为。

没有真正的方法可以区分浏览器请求图像和浏览器请求 HTML 文档。

某些浏览器可能会根据他们的要求发送不同的 Accept 标头,但我不会依赖于此。


自动请求的资源(如favicon.icorobots.txt)往往是顶级资源。

利用路径为您的资源制定更具体的约定,而不是将所有内容都放在无法区分一物与另一物的顶层。

app.get('/', (req, res) => {
    res.render('index', {title: 'Recent Stories'});
});

app.get('/stories/:title', (req, res) => {
    // ...
    const match = actualData.find((e) => e.title === req.params.title)
    // etc
});

如果您要发送带有“未找到”消息的“Ops”页面,那么只需将其设为 404 错误即可。浏览器知道如果他们请求 favicon.ico 并收到 404 错误时该怎么办……即使它是格式正确的 404 错误。

【讨论】:

    【解决方案2】:

    更新

    我建议您拆分处理程序,然后添加特定的页面加载逻辑。

    此外,如果您的 stories.json 文件没有更改,您可以避免在每次请求时读取/解析它。 (不过,可以实现进一步的逻辑以在需要时在内存中更新它)。

    const stories = JSON.parse(fs.readFileSync('stories.json', 'utf8')).reduce((acc, val) => {
        acc[val.title] = val.body;
        return acc;
    }, {});
    
    app.get('/', (req, res) => {
        res.render('index', {title: 'Recent Stories'});
    });
    
    app.get('/*', (req, res) => {
        const story = stories[req.url];
    
        if (story) {
            res.render('stories', {title: req.url, body: story});
        } else {
            res.render('stories', {title: 'Ops,', body: 'Not found!'});
        }
    });
    

    【讨论】:

    • OP 方法的重点是不必必须拼出可能的数十条路线。
    • @ChrisG 抱歉,我误解了这个问题。刚刚修正了我的答案。
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多