2016-02-14 95 views
1

我是新来的Node.js和Express.js及其路由。它的设置都正确,除了下面的代码外,它都可以工作。ExpressJS sendFile()不能发送URL GET参数

我尝试下面的代码:

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 | Error: ENOENT, stat '/opt/lampp/htdocs/papei/public/game/32'

我搜索这个错误,我想它有没有被发现的文件做。问题是,/public/game.html存在。如果我删除sendFile()中的部分,那么它就可以工作。但我想sendFile()正在寻找一个确切的网址,并没有找到它。

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

回答

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}) 
}); 

无论采用哪种方式,您都不需要使用捕获所有路由和正则表达式来获取查询参数,请参见快速文档中的req.paramsreq.query

希望这会有所帮助。

+0

我正在尝试重定向,但它不起作用。我不确定你将如何制作模板 - 你能否提供相关文档?谢谢。 –

+0

另外,“express-static”是什么意思?它与我目前使用的代码有什么不同? –

+1

如果您尝试使用重定向,请确保您的快速静态中间件位于重定向路由的下方。 [Here](http://expressjs.com/en/guide/using-template-engines.html)是解释模板引擎的文档,[here](http://expressjs.com/en/starter/static-files .html)是提供静态文件(又名'express-static')的文档。 –