使用查询字符串表示res.sendFile()

时间:2015-09-12 11:19:47

标签: html node.js express static

我已经使用res.sendFile()成功实现了服务静态文件,但是如果我添加了一些查询字符串,它就不起作用了。

E.g。以下代码绝对正常。

res.sendFile(path.join(__dirname, '../public', '/index.html'));

但如果我这样做,就会失败

res.sendFile(path.join(__dirname, '../public', '/index.html?id=' + req.params.id));

res.sendFile(path.join(__dirname, '../public', '/index.html?id=123'));

然后我收到以下错误

ENOENT, stat '/Users/krishnandu/Documents/Project/public/index.html?id=123'

404

Error: ENOENT, stat '/Users/krishnandu/Documents/Project/public/index.html?id=123'
    at Error (native)

2 个答案:

答案 0 :(得分:3)

您无法使用res.sendFile()传递查询字符串参数。您必须将文件路径指定为res.sendFile()

中的第一个参数

语法是:

res.sendFile(path [, options] [, fn])

所以你可以做的是,

  1. 使用带路线的查询字符串,例如 route1 (请参阅以下代码)

  2. route1 的GET方法中,使用res.sendFile()

    app.get('/route1',function(req,res){
      res.sendFile(path.join(__dirname, '../public', '/index.html'));
    });
    
    res.redirect('/route1?id=123');
    
  3. 另请参阅Express API documentationres.sendFileres.redirect

答案 1 :(得分:1)

此答案是通过在评论中涵盖@Sky提出的问题来进一步增加@Marie Sajan的答案。

使用@Marie Sajan的答案后,要访问id中的index.html,可以使用普通的客户端javascript。您可以在html文件的<script>标签中执行以下操作:

var query = location.href.split("?")[1];

这将为您提供一个字符串,例如“ id = 123&name = ted”。 在这里,您可以使用javascript获取id的值。完整的代码可能如下所示:

var query = location.href.split("?")[1]; //A string of all parameters in the URL
var params = query.split("&"); //Turns the string into an array of parameters
var id; //To store the value of id

params.forEach((param, index) => {
    //This checks each key-value pair, in the format key=value, for the specific id key we want
    var key = param.split("=")[0]; //In id=123, this would be "id"
    var value = param.split("=")[1]; //In id=123, this would be "123" (as a String)
    if (key == "id") id = value;
});

现在,javascript变量id将包含值“ 123”。

如果您还在寻找除id键之外的更多查询参数的值,则只需在if内添加更多forEach语句来检查那些特定的键

在诸如“ http://google.com/?q=stack+overflow&id=123”的链接中,当直接在{{的HTML文件中)实现为客户端javascript时,此代码将能够获得id的值“ 123” 1}}标签,或HTML文件使用的单独的客户端js文件中。请注意,@ Marie Sajan的答案完全是服务器端代码,而客户端将使用此代码。

此答案未解决原始问题,仅根据此页面查看者的需求在已接受的问题答案中添加了更多有用的内容。 < / p>