【问题标题】:Having some trouble understanding middleware无法理解中间件
【发布时间】:2015-04-11 10:17:20
【问题描述】:

所以我想设置一个基本的节点服务器来与我的客户端 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. 如果不存在,请在 ./public/ 下查找
  4. 如果不存在,请查看 ./tmp/
  5. 如果它不存在并且请求在“/”之后包含某些内容,则服务 index.html

我将如何处理客户端路由(使用 Angular 的 $routeProvider)我还不清楚,也许我什至不需要这样做,我不确定这些请求是否会发送到服务器。

但是,这样做会导致无限循环,老实说,我不知道为什么。我以为我了解中间件,但显然我的逻辑有问题,或者这会起作用。

所以基本上我的两个问题是:

  1. 是我总结的express'中间件的工作原理吗?
  2. 如果不是,也许您可​​以推动我朝着正确的方向前进?

不要只是指着我表达'文档,我已经阅读了大约 5 次,但我发现文档解释得不够清楚。

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

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

    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里没变。

    【讨论】:

    • 我去看看那篇文章,谢谢你的回答!我也会尝试这段代码以更好地理解它
    【解决方案2】:

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

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

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

    【讨论】:

    • 路由 != 中间件 ?
    • 顺便说一句,这给了我同样的无限循环。只是删除它确实加载了页面,但是我的 ng-view 指令没有加载默认视图,真的很奇怪
    • 这是在加载页面中:
    • 在那里更新了我的答案。上面的代码在本地对我有用 - 如果您有任何问题,请告诉我。
    • 对我不起作用,只尝试一个请求:对 '/' 的请求失败
    猜你喜欢
    • 2016-10-18
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多