node.js - 如果我将 express.static 包装在一个函数中,服务器将停止工作
问题描述
下面的代码有效:
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!');
});
为什么?服务器似乎没有发现任何错误
解决方案
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
});
请求永远不会被处理,也永远不会调用 next 来推进到其他路由处理程序,因此请求只会卡住并最终超时。
推荐阅读
- report - 如何创建表格的自定义“摘要/总计”
- google-chrome - 无法在 Mozilla 中使用 JMETER 记录网络流量在将端口更改为 8080 时出错
- google-chrome - Chrome SVG 渲染工件
- c++ - 泛化我的可变参数模板函数时出错
- python - 由 PyQt4 创建并在 python 中执行的 GUI 没有打开
- azure - 了解 Azure CDN
- macos - CAN 所需的原始套接字在 MacOS 下不起作用 - 套接字:协议不支持地址系列
- symfony - 奏鸣曲默认过滤器值
- javascript - 多个 Recaptcha 错误:reCAPTCHA 占位符元素必须是元素或 id
- firebase - 发送firebase云消息时如何触发云功能?