【问题标题】:What express route can I use for any file in a directory?我可以对目录中的任何文件使用什么快速路由?
【发布时间】:2020-01-30 12:00:26
【问题描述】:

我有一个包含PDF 文件的目录,我只希望授权用户访问这些文件。目前,问题是当我导航到包含文件夹中给定文件的 URL 时,get 回调没有运行。例如,我希望当我转到 localhost:3000/Buyer_templates/file.pdf 时,它会在 get 中运行回调。目前,它允许我查看 pdf 并且不执行回调。

app.get('/Buyer_templates/*', (req,res) => {
    res.redirect('/')
})

如果 url 不是文件(例如 /Buyer_templates/blahblahblah),则上述代码有效

但是,当我输入一个文件名(例如Buyer_templates/file.pdf)时,回调没有被激活。

我也在get中尝试了这些路径

/Buyer_templates/*.*

/Buyer_templates/(.*)

问题是回调没有被执行。当我在 URL 中输入任何 PDF 文件名时,如何才能运行回调?

【问题讨论】:

  • 你配置了静态路由吗?
  • @James 我正在使用这个app.use( express.static(__dirname));(对不起,我是新手)
  • 如果您使用静态路由,您的 pdf 文件将像 css 文件或图像一样可供所有人使用。使用自定义路由,检查用户是否有凭据,然后才提供静态文件。我对 mp4 视频做了类似的事情,检查它jsfiddle.net/2uqtagn5

标签: javascript node.js express routes


【解决方案1】:

当您在 Express 中配置 static 路由时,会自动提供来自根文件夹的层次结构中的任何文件。例如,如果我有这样的文件夹结构:

root
- public
-- css
-- js
-- img

我的服务器看起来像

app.use(express.static('public'));
app.use((req, res, next) => {
  console.log(`REQUEST LOGGED: ${req.url}`);
  return next();
});
...

当我访问驻留在该静态根目录中的任何文件 URL 时,例如

/css/somefile.css
/js/somefile.js
/img/somefile.jpg

然后你会注意到这个请求从来没有命中console.log,那是因为Express知道这些是一个。文件和 b.驻留在静态目录中,因此不需要任何进一步处理(因此,为什么您会注意到,如果您尝试非文件 URL,它们确实会进一步处理)。

在向静态文件添加某种形式的授权方面,有几种方法可以做到,例如

  • 从静态路由中排除此特定文件夹并处理您将在任何其他路由中执行的授权
app.get('/Buyer_templates/*', (req, res, next) => 
  if (/* some authorization check */) {
    return res.sendFile('...');
  } else {
    return res.status(403).send('Unauthorized');
  }
});
  • 在设置静态路由之前添加您的授权中间件(虽然这意味着需要更多的工作来确定要检查的 URL 等)
app.use((req, res, next) => {
  if (req.path.startsWith('/Buyer_templates')) {
    return res.status(403).send('Unauthorized');
  }
  return next();
})
app.use(express.static(__dirname));

上面的例子只是为了演示而简单化,但它们应该会给你想要的效果。此外,值得指出的是 express.static(__dirname) 是不可取的,因为它会使 all 文件可以从您的应用程序的根目录访问,其中包括您可能在服务器上托管的任何代码。更具体,即express.static('Buyer_templates')

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2016-12-06
    • 2013-09-22
    • 2020-07-07
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多