如果我将express.static包装在函数中,则服务器将停止工作

时间:2019-06-16 05:55:43

标签: node.js express

以下代码有效:

var express = require('express');
var path  = require('path');
var app = express();
app.use('/public', express.static("./public"));
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

但是,如果我这样更改app.use

var express = require('express');
var path  = require('path');
var app = express();
app.use('/public', function(){express.static("./public")}); 
// browser error "cannot GET /
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

为什么?服务器似乎没有发现任何错误

2 个答案:

答案 0 :(得分:1)

express.static()在调用时返回中间件函数。您必须将该特定的返回函数传递给app.use()。您不仅会在每个请求上都致电express.static()。调用一次,获取返回的函数并将其注册为中间件,然后app.use()将在每个请求上调用该中间件函数。


以这种正确的方式进行操作时:

app.use('/public', express.static("./public"));

就像这样做:

const fn = express.static("./public");
app.use('/public', fn);

甚至是这样:

const fn = express.static("./public");
app.use('/public', function(req, res, next) {
    fn(req, res, next);
});

希望您能看到以下代码:

app.use('/public', function(){express.static("./public")}); 

与任何正确的解决方案都不具有相同的作用。这会在每个请求中调用express.static(),而从不调用为给定请求执行实际工作的返回函数。


像工厂函数一样思考express.static("./public")。它创建了一个中间件函数,然后将其传递给app.use()或以reqresnext作为参数来调用自己。

  

为什么?服务器似乎没有发现任何错误

执行app.use('/public', function(){express.static("./public")});不是您想要的,但是也不会产生错误。它所做的就是在每个单个请求上创建一个新的中间件功能(您可以忽略)。它还永远不会调用next来让任何其他请求处理程序处理该请求,这样您的服务器将卡在每个请求上,但实际上不会导致可见错误。

从本质上讲,它在功能上等同于此:

app.use('/public', function(req, res, next) {
   // do nothing, just causes the request to get stuck since
   // the request is not handled (no response is sent)
   // and next is never called
});

永远不会处理该请求,也不会再调用它来前进到其他路由处理程序,因此该请求只会卡住,最终会超时。

答案 1 :(得分:1)

您可以尝试:

  app.use(express.static(path.resolve(__dirname, './public'), { maxAge: '1d' }));