【问题标题】:ExpressJS sendFile() cannot send URL GET parametersExpressJS sendFile() 无法发送 URL GET 参数
【发布时间】:2016-02-14 00:46:54
【问题描述】:

我是 Node.js 和 Express.js 及其路由的新手。一切设置正确,除了以下代码外,一切正常。

我尝试了以下代码:

app.get("/game/*", function(req, res) {
  res.sendFile(__dirname + "/public/game.html?gameId=" + /\/([^\/]+$)/.exec(req.url)[1]);
});

目标是将带有/game/{gameId}(其中gameId 是某个数字)的所有请求发送到/public/game.html?gameId={gameId}

它正确地获取带有/game/ 的请求,从URL 中获取gameId 参数,并尝试sendFile() 它。但是,sendFile() 不起作用,说:

web.1 |错误:ENOENT,stat '/opt/lampp/htdocs/papei/public/game/32'

我已经搜索过这个错误,我猜它与找不到文件有关。问题是,/public/game.html 存在。如果我删除sendFile() 中的?gameId... 部分,那么它可以工作。但我猜sendFile() 正在寻找一个 exact URL,但没有找到它。

有没有办法使用 ExpressJS 发送 URL GET 参数?

【问题讨论】:

    标签: node.js express routing


    【解决方案1】:

    我认为问题在于sendFile 试图按照您的想法找到完全匹配(您的查询参数会中断)。

    您可以使用express-static 来提供 html 页面,然后根据需要重定向到它,如下所示:

    app.get("/game/:gameid", function(req, res) {
      // Not ideal, as it uses two requests
      res.redirect('/game.html?gameId=' + req.params.gameid)
    });
    

    或者您可以将 html 放入模板中并为响应呈现它,例如:

    app.get("/game/:gameid", function(req, res) {
      // Render the 'game' template and pass in the gameid to the template
      res.render('game', {gameid: req.params.gameid})
    });
    

    无论哪种方式,您都不需要使用 catch all 路由和正则表达式来获取查询参数,请参阅 express 文档中的 req.paramsreq.query

    希望这会有所帮助。

    【讨论】:

    • 我正在尝试重定向,但它不起作用。而且我不确定您将如何制作模板——您能否为此提供文档?谢谢。
    • 另外,express-static 是什么意思?和我现在使用的代码有区别吗?
    • 如果您尝试使用重定向,请确保您的 express-static 中间件位于重定向的路由下方。 Here 是解释模板引擎的文档,here 是提供静态文件的文档(又名 express-static)。
    • 我不知道。当您只显示一小部分代码时,这是问题的一部分。请包括所有相关代码,否则人们只能推测。我建议你看看使用模板方法——如果你已经写了很多 html,你可能想要使用非常相似的东西(我建议你看看把手)。
    • 现在可以了。谢谢!感谢您提供有关模板和 req.params 的额外信息。
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多