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

时间:2017-02-15 05:49:30

标签: javascript node.js express static

我想显示一个自定义的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()是不可能的?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

将我的一些评论转化为答案,因为这导致了您的解决方案。

  

对于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