以下代码有效:
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!');
});
为什么?服务器似乎没有发现任何错误
答案 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()
或以req
,res
和next
作为参数来调用自己。
为什么?服务器似乎没有发现任何错误
执行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' }));