理解中间件时遇到一些麻烦

时间:2015-04-11 10:17:20

标签: javascript node.js express middleware

所以我想设置一个基本节点服务器来使用我的客户端Angular应用程序。我的文件夹结构如下所示:

.tmp //Contains css stylesheet
bower //Obviously contains bower packages
public //Contains client code

这就是我index.html的样子(至少是脚本/样式表)

 <!-- 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'));

我的理解是:对于每个请求:

  1. 记录
  2. 查看是否可以在./
  3. 下找到文件请求
  4. 如果不存在,请查看./public /
  5. 如果不存在,请查看./tmp /
  6. 如果它不存在,请求中包含的内容是&#39; /&#39;服务index.html
  7. 我现在还不清楚我将如何处理客户端路由(使用Angular&#39; $routeProvider),也许我甚至不需要这样做,I&I #39;我不确定这些请求是否会转到服务器。

    然而,所有这一切导致无限循环,我真的不知道为什么。我以为我理解中间件,但显然我的逻辑出现了问题,或者这样做会有效。

    基本上我的两个问题是:

    1. 我总结了如何表达&#39;中间件有效吗?
    2. 如果不是,也许你可以给我一个正确的方向?
    3. 不要指着我表达&#39; docs,我已经读完了5次,但我发现文档没有说清楚。

2 个答案:

答案 0 :(得分:2)

简短的回答是,中间件是您可以根据请求插入的所有内容。生命周期。查看其工作原理的一个好方法是编写一个简单的中间件,例如一个非常基本的记录器中间件:

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并查看如何在服务器端设置路由。它有点老了,但这部分在快递方面没有改变。

答案 1 :(得分:1)

关闭。您的静态路由看起来不错。最大的问题是“路径”和“路径”。 - 不是中间件。我想你想要的是:

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');
});

这样可以避免在不同的文件夹等中出现同名文件的任何问题,并隐藏您不想让人们访问的代码......