【问题标题】:For Express.js 4.x, is it possible to use express.static twice?对于 Express.js 4.x,是否可以使用 express.static 两次?
【发布时间】:2017-02-15 05:49:30
【问题描述】:

我想展示一个自定义的 404 页面(包含 html、css、img 和 ico)。当我替换第一个公共静态主页时,我知道我的 404 文件夹有效。但是,我相信我要么没有以正确的方式使用路由,要么无法设置两个静态文件夹。

我根本不想使用模板视图引擎。我希望一切都在前端呈现。

我的项目如下:

404
--index.html
--error.css
--404.jpg
bin
--server.js
public
--index.html
routes
--index.js
package.json
app.js

app.js

...
var index = require(./routes/index); //works
...
app.use(favicon(__dirname + '/public/content/images/logo.ico'));
app.use(logger('dev'));
app.use(jsonParser);
app.use(urlencodedParser);
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); //love it
app.use('/', index); //this is fine
...

index.js

var express = require('express');
const path = require('path');
var router = express.Router();

router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});

router.use('/', express.static(path.join(__dirname, './404'))); // HALP!

module.exports = router;

我玩过这个目录(尝试使用“404”与“./404”)。我正在通过输入“localhost:3000/error”对此进行测试。所以如果我的路径是'/error',它仍然应该使用父路径:'/'。文档指出,只要我的路线放在最后,它应该仍然有效。我在没有 express.static 的情况下对其进行了测试,并使用了一个在控制台上打印错误的匿名函数。

难道不能用两次 express.static() 吗?

【问题讨论】:

  • 是的,您可以使用多个express.static()。它只是中间件,您可以拥有任意数量的中间件。它们将按照您注册它们的顺序进行搜索。根本不清楚您要完成什么。如需静态路由帮助,请显示几个您希望在文件系统中加载特定文件的确切 URL 示例,并准确显示文件在文件系统中的位置。
  • 不能使用任何路径吗?我想在主页之外的任何路径“/”上使用“express.static()”。换句话说,为什么 'router.use('/', express.static(path.join(__dirname, './404');' 不起作用?当我删除静态并仅测试 console.log 时它会起作用。
  • 仅供参考,自定义 404 页面在任何情况下都不需要 express.static()。通常,您只需创建所需的 404 中间件处理程序作为最后一个中间件,然后 res.sendFile() 您要显示的任何文件。此处显示了 404 处理程序示例:expressjs.com/en/starter/faq.html。如果你只是想将一个完成的 HTML 文件发送到客户端(没有服务器端渲染),那么在 404 中间件中使用res.sendFile(someLocalFilePath)
  • express.static() 有多种使用方式。它可以配置为仅对某些请求路径起作用。或者,它可以配置为检查每个请求以查看是否有与其路径匹配的静态文件。根据定义,您不要将 express.static() 用于 404 处理程序。如果有一个文件与路由请求匹配并且express.static() 找到它,那么它是 200 成功响应,而不是 404。您使用中间件来处理未找到其他路由的请求,并且在该中间件中,您将响应设置为静态 404并决定向浏览器发送什么。

标签: javascript node.js express static


【解决方案1】:

将我的一些 cmets 移动到答案中,因为这导致了您的解决方案。

对于 Express.js 4.x,是否可以使用 express.static 两次?

是的,您可以根据需要多次使用express.static()。它是中间件,如果找不到与请求匹配的文件,它只会调用next() 并允许中间件链继续。因此,您可以拥有任意数量的文件,并且每个文件都将按照您注册它们的顺序搜索匹配的文件。

我想展示一个自定义的 404 页面(包含 html、css、img 和 ico)。当我替换第一个公共静态主页时,我知道我的 404 文件夹有效。但是,我相信我要么没有以正确的方式使用路由,要么无法设置两个静态文件夹。

您错误地尝试使用 express.static() 来实现自定义 404 页面。那不是它的作用。实现自定义 404 页面的常用方法是使用链中的最后一个中间件处理程序。当它被击中时,没有其他东西与当前请求匹配,因此您发送自定义 404 页面。

通常看起来像这样:

app.use(function(req, res, next) {
    res.status(404).sendFile(localPathToYour404Page);
});

请参阅此Express starter FAQ 的“我如何处理 404 响应”部分。

还有,这是一个 article on custom error pages,其中显示了一些其他示例。

【讨论】:

  • 最佳答案当之无愧的投票。但希望没有人看到这个可耻的问题。哈哈!
【解决方案2】:

https://github.com/jekku/users/blob/master/server.js#L41

这是我在 ExpressJS 应用程序上路由静态文件的方法。我通常不在路线中这样做,但我认为这是一个“初始化”过程。可以使用任何中间件两次甚至更多次 - 尽可能多地使用,记住这一点。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2015-05-16
    • 2020-07-19
    相关资源
    最近更新 更多