ExpressJS sendFile()无法发送URL GET参数

时间:2016-02-14 00:46:54

标签: node.js express routing

我是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/正确获取请求,从网址获取gameId参数,然后尝试sendFile()。但是,sendFile()不起作用,说:

  

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

我搜索了这个错误,我想这与未找到的文件有关。问题是,/public/game.html存在。如果我删除了?gameId...中的sendFile()部分,那么它就可以了。但我想sendFile()正在寻找一个完全的网址,而且找不到它。

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

1 个答案:

答案 0 :(得分:3)

我认为问题在于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 all route和regex来获取查询参数,请参阅快速文档中的req.paramsreq.query

希望这有帮助。