Nodejs Express 如何设置一个指定文件名的路由,不用正则

Nodejs Express 如何设置一个指定文件名的路由,不用正则

app.get(’/:file.css’, fn),我希望这个 file 是任意长的路径,目前用正则的方式是:app.get("/:file([0-9a-zA-Z]+).css", fn),很奇怪正则用 .+ 不行,\w+ 貌似也不行,奇怪。

5 回复

Node.js Express 如何设置一个指定文件名的路由,不用正则

在使用 Express 框架时,有时我们需要设置特定文件名的路由,比如处理 .css 文件。通常情况下,我们可能会想到使用正则表达式来匹配任意长度的路径,但有时候正则表达式可能不是最佳选择。

示例需求

假设你希望创建一个路由来处理所有以 .css 结尾的文件请求,并且这些文件可以位于任意路径下。例如:

  • /styles/main.css
  • /assets/theme/style.css
  • /other/styles/another.css

使用路径参数

你可以通过定义路径参数来实现这一目标。Express 允许你在路由中使用冒号 : 来定义路径参数。在这种情况下,你可以直接定义一个路径参数并将其与 .css 文件扩展名结合起来。

const express = require('express');
const app = express();

// 定义一个处理 .css 文件的路由
app.get('/:file.css', (req, res) => {
    const fileName = req.params.file;
    // 在这里处理文件,例如读取文件内容或返回文件
    res.send(`Handling CSS file: ${fileName}.css`);
});

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 路径参数:file 是一个路径参数,它会捕获 URL 中的任意字符串。
  2. 文件扩展名.css 是固定的文件扩展名,确保只有 .css 文件被匹配到。
  3. 请求处理函数:在请求处理函数中,你可以通过 req.params.file 访问到文件名(不包括扩展名)。

这种方式不需要使用复杂的正则表达式,简单明了地实现了对特定文件类型的路由处理。

注意事项

  • 确保你的应用逻辑能够正确处理不同路径下的 .css 文件。
  • 如果需要更复杂的文件处理逻辑(如文件不存在的情况),可以在请求处理函数中添加相应的检查和错误处理。

通过这种方式,你可以轻松地为不同的 .css 文件设置路由,而无需使用复杂的正则表达式。


给楼主标记了代码… app.get 字符串参数里不是使用正则的, 真要用正则也不能在字符串里写啊: http://expressjs.com/api.html#app.VERB

app.get(/^\/commits\/(\w+)(?:\.\.(\w+))?$/, function(req, res){
  var from = req.params[0];
  var to = req.params[1] || 'HEAD';
  res.send('commit range ' + from + '..' + to);
});

express可以我这样的写法少,实测有效的,express 4,3应该也可以的 你这个正则太长了,我就是不想用正则这么长 比如:app.get("/:file.html"),这个file可以是/folder/index.html,也可以是/foo/bar/xx.html,我只要这个扩展名匹配就可以了

re = /^\/(?:[^\/]+\/)*(.+)\.html$/
re.exec("/folder/index.html"); // ["/folder/index.html", "index"]

还是正则爽,捕获到的是filename

对于 Node.js 中使用 Express 设置一个指定文件名的路由,并且希望这个文件名可以是任意长度的情况,你可以直接使用路径参数而无需正则表达式。Express 的路由匹配机制允许你定义包含参数的路径,这些参数会自动被解析并传递给处理函数。

示例代码

const express = require('express');
const app = express();

// 定义一个路由来匹配所有 .css 文件,无论文件名有多长
app.get('/*.css', (req, res) => {
    const filePath = req.params['0']; // 获取路径参数
    res.send(`处理请求的 CSS 文件路径为: ${filePath}`);
});

// 启动服务器
app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000');
});

在这个例子中,/*.css 匹配任何以 .css 结尾的路径,req.params['0'] 会包含从根目录到 .css 文件的完整路径。请注意,这里的 req.params['0'] 实际上获取的是路径中匹配部分的第一个元素,也就是路径中的 file 部分。

如果你希望获取更细粒度的路径控制,例如仅匹配特定目录下的 .css 文件,你可以修改路由模式为 '/styles/*.css' 或其他具体路径。

解释

  1. 路由定义/*.css 定义了一个通用的路由,用于匹配所有以 .css 结尾的 URL。
  2. 参数提取req.params['0'] 提取了路径中匹配的部分。
  3. 响应处理:服务器返回一条消息,显示请求的 CSS 文件路径。

这样设置后,不需要复杂的正则表达式,Express 自动处理路径参数并将它们传递给相应的处理函数。

回到顶部