在理解中间件时遇到一些困难
Having some trouble understanding middleware
所以我想设置一个基本的节点服务器来与我的客户端 Angular 应用程序一起工作。我的文件夹结构如下所示:
.tmp //Contains css stylesheet
bower //Obviously contains bower packages
public //Contains client code
这就是我的 index.html
的样子(至少 scripts/stylesheets)
<!-- bower:css -->
<link rel="stylesheet" href="bower/bootstrap/dist/css/bootstrap.css" />
<!-- endbower -->
<!-- inject:css -->
<link rel="stylesheet" href="/.tmp/styles.css">
<!-- endinject -->
<!-- bower:js -->
<script src="bower/jquery/dist/jquery.js"></script>
<script src="bower/angular/angular.js"></script>
<script src="bower/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower/angular-route/angular-route.js"></script>
<script src="bower/angular-resource/angular-resource.js"></script>
<!-- endbower -->
<!-- inject:js -->
<script src="/public/app/modules/sportStore.module.js"></script>
<script src="/public/app/controllers/checkout.controller.js"></script>
<script src="/public/app/controllers/productList.controller.js"></script>
<script src="/public/app/controllers/sportsStore.controller.js"></script>
<script src="/public/app/filters/customFilters.js"></script>
<script src="/public/app/components/cart/cart.js"></script>
<!-- endinject -->
这是我的 server.js 文件中的中间件配置:
app.use(logger()); //require('morgan')
app.use(express.static('./'));
app.use(express.static('./public/'));
app.use(express.static('./tmp/'));
app.use('/*', express.static('./public/index.html'));
我的理解是:对于每个请求:
- 登录
- 看看能不能在./下找到文件请求
- 如果不存在,请在 ./public/
下查找
- 如果不存在,请查看 ./tmp/
- 如果它不存在并且请求包含“/”服务后的内容 index.html
我还不清楚我将如何处理客户端路由(使用 Angular 的 $routeProvider
),也许我什至不需要这样做,我我不确定这些请求是否会发送到服务器。
然而,所有这些都会导致无限循环,老实说,我不知道为什么。我以为我了解中间件,但显然我的逻辑有问题,或者这会起作用。
所以基本上我的 2 个问题是:
- 就是我总结出来的express中间件的工作原理吗?
- 如果不是,也许你可以给我一个正确的方向?
不要只是指点我表达文档,我已经阅读了大约 5 遍,但我发现文档解释得不够清楚。
一个简短的回答是,中间件是您可以为请求的生命周期插入的一切。查看其工作原理的一个好方法是编写一个简单的中间件,例如非常非常基本的记录器中间件:
var logMiddleware = function(req, res, next) {
// We do some logging
console.log(req.method+" "+req.url);
// Because this is a **middle**ware, we can stop the request here
// using the res object, or call next() and it will continue it's
// lifecycle.
next();
}
app.use(logMiddleware);
您注册中间件的顺序(使用 app.use
)很重要,正如您在原始问题中所说的那样,它是一个链。
编辑:关于 Angular,您可以查看 this blog post 并了解如何在服务器端设置路由。有点旧了,不过express这部分没变
关闭。您的静态路由看起来不错。最大的问题是 'path' - 而不是中间件。我想你想要的是:
app.use(function(req, res) {
res.redirect('/public/index.html'); // note: redirecting to root, not ./public
});
然而,最好不要静态地提供所有内容!您可以执行以下操作:
app.use('/public', express.static(__dirname + '/public');
app.use('/bower', express.static(__dirname + '/bower'));
app.use('/.tmp', express.static(__dirname + '/.tmp'));
app.use(function(req, res) {
res.redirect('/public/index.html');
});
这将避免不同文件夹中的同名文件等出现任何问题,并隐藏您不想让人们访问的代码...
所以我想设置一个基本的节点服务器来与我的客户端 Angular 应用程序一起工作。我的文件夹结构如下所示:
.tmp //Contains css stylesheet
bower //Obviously contains bower packages
public //Contains client code
这就是我的 index.html
的样子(至少 scripts/stylesheets)
<!-- bower:css -->
<link rel="stylesheet" href="bower/bootstrap/dist/css/bootstrap.css" />
<!-- endbower -->
<!-- inject:css -->
<link rel="stylesheet" href="/.tmp/styles.css">
<!-- endinject -->
<!-- bower:js -->
<script src="bower/jquery/dist/jquery.js"></script>
<script src="bower/angular/angular.js"></script>
<script src="bower/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower/angular-route/angular-route.js"></script>
<script src="bower/angular-resource/angular-resource.js"></script>
<!-- endbower -->
<!-- inject:js -->
<script src="/public/app/modules/sportStore.module.js"></script>
<script src="/public/app/controllers/checkout.controller.js"></script>
<script src="/public/app/controllers/productList.controller.js"></script>
<script src="/public/app/controllers/sportsStore.controller.js"></script>
<script src="/public/app/filters/customFilters.js"></script>
<script src="/public/app/components/cart/cart.js"></script>
<!-- endinject -->
这是我的 server.js 文件中的中间件配置:
app.use(logger()); //require('morgan')
app.use(express.static('./'));
app.use(express.static('./public/'));
app.use(express.static('./tmp/'));
app.use('/*', express.static('./public/index.html'));
我的理解是:对于每个请求:
- 登录
- 看看能不能在./下找到文件请求
- 如果不存在,请在 ./public/ 下查找
- 如果不存在,请查看 ./tmp/
- 如果它不存在并且请求包含“/”服务后的内容 index.html
我还不清楚我将如何处理客户端路由(使用 Angular 的 $routeProvider
),也许我什至不需要这样做,我我不确定这些请求是否会发送到服务器。
然而,所有这些都会导致无限循环,老实说,我不知道为什么。我以为我了解中间件,但显然我的逻辑有问题,或者这会起作用。
所以基本上我的 2 个问题是:
- 就是我总结出来的express中间件的工作原理吗?
- 如果不是,也许你可以给我一个正确的方向?
不要只是指点我表达文档,我已经阅读了大约 5 遍,但我发现文档解释得不够清楚。
一个简短的回答是,中间件是您可以为请求的生命周期插入的一切。查看其工作原理的一个好方法是编写一个简单的中间件,例如非常非常基本的记录器中间件:
var logMiddleware = function(req, res, next) {
// We do some logging
console.log(req.method+" "+req.url);
// Because this is a **middle**ware, we can stop the request here
// using the res object, or call next() and it will continue it's
// lifecycle.
next();
}
app.use(logMiddleware);
您注册中间件的顺序(使用 app.use
)很重要,正如您在原始问题中所说的那样,它是一个链。
编辑:关于 Angular,您可以查看 this blog post 并了解如何在服务器端设置路由。有点旧了,不过express这部分没变
关闭。您的静态路由看起来不错。最大的问题是 'path' - 而不是中间件。我想你想要的是:
app.use(function(req, res) {
res.redirect('/public/index.html'); // note: redirecting to root, not ./public
});
然而,最好不要静态地提供所有内容!您可以执行以下操作:
app.use('/public', express.static(__dirname + '/public');
app.use('/bower', express.static(__dirname + '/bower'));
app.use('/.tmp', express.static(__dirname + '/.tmp'));
app.use(function(req, res) {
res.redirect('/public/index.html');
});
这将避免不同文件夹中的同名文件等出现任何问题,并隐藏您不想让人们访问的代码...