我正在阅读Express.js API reference中的两个例子,但我没有得到它们。
现在假设您要忽略静态文件的日志记录请求,但继续记录logger()之后定义的路由和中间件。你可以简单地在它上面移动static():
app.use(express.static(__dirname + '/public'));
app.use(logger());
// other middleware
这是如何导致不记录静态文件的请求?每个请求都不是所有中间件(按顺序执行)吗?
另一个具体的例子是提供来自多个目录的文件,优先于" ./ public"超过其他人:
app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/files'));
app.use(express.static(__dirname + '/uploads'));
我怀疑,例如像" /js/stuff.js"这样的请求,第一个中间件检查" /public/js/stuff.js"存在。如果是,则此中间件处理请求并且没有后续中间件被执行(类似于提前返回)。如果此路径不存在,则此中间件将请求传递给下一个中间件。这是对的吗?
请解释这两个例子!
答案 0 :(得分:5)
Express路由只是中间件的集合。每个对服务器的请求都是通过中间件链传递的。
中间件功能具有签名
function(req, res, next) { }
您可以使用app.use()
向中间件添加中间件,如上所示。
每个中间件都有两个选择。它可以
如果中间件无法执行上述任何一项操作,您会看到请求超时并且无休止地“旋转”。
要传递请求,中间件必须调用next()
。传递给中间件的第三个参数是next()
函数。它可能有副作用,如上面的记录器中间件。
要结束请求,中间件可以使用附加到res
对象的多种方法之一,例如res.send()
或res.end()
来发送响应回到请求者。因此,express.static
中间件的行为是,如果找到所请求的文件,结束请求链,发送该文件。如果找不到所请求的文件,则将>>请求传递给下一个中间件。