从没有扩展名的Express提供静态文件,发出具有相同名称的子目录的文件

时间:2018-05-25 02:32:12

标签: node.js express

这里的目标是使用url为我的静态站点(使用nuxtjs生成)提供服务,而不使用斜杠。

我想通过网址foo.html投放/foo 为此,我使用带静态扩展选项的快速静态

app.use(express.static(__dirname + '/public', { extensions: 'html' }))

除非html文件与文件夹同名,否则工作正常。 让我们考虑一下这个文件树:

foo.html
bar.html
bar/baz.html

/foo将投放foo.html

/bar/baz将投放baz.html

/bar会重定向到/bar/

我试图以这种方式停用重定向选项:

app.use(express.static(__dirname + '/public', { extensions: 'html', redirect: false }))

现在/bar不再重定向,但文件bar.html仍未提供!

Express正在转移到next()

我能够在其他路由之后提供bar.html:

app.use(function(req, res, next) {
    var file = __dirname + '/public' + req.path + '.html'
    fs.exists(file, function(exists) {
        if (exists) res.sendFile(file)
        else next()
    })
})

但我觉得这不应该是正确的方法,我应该能够用静态服务我的所有文件。

1 个答案:

答案 0 :(得分:0)

从Express 4.8.0起,您可以使用res.sendFile来替代express.static。它使用相同的支持代码,并支持相同的功能,例如HTTP缓存支持,内容类型标头等。

const root = path.join(__dirname, '/public');
app.use((req, res, next) => {
  const file = req.url + ".html";
  fs.exists(path.join(root, file), (exists) =>
    exists ? res.sendFile(file, {root}) : next()
  );
});