【问题标题】:ByRef / ByVal issue?ByRef / ByVal 问题?
【发布时间】:2015-02-15 06:32:53
【问题描述】:

我正在观看一些关于 nodejs 的介绍视频。我遇到了一个我想通的问题,但我想了解“为什么”。这是有问题的原始代码:

    var http = require("http");
    var express = require("express");
    var bodyParser = require('body-parser');
    var app = express();

    var controllers = require("./controllers");

    controllers.init(app);
    app.use(express.static(__dirname + "/public"));

    app.set("view engine", "vash");
    app.use(bodyParser.urlencoded({ extended: false }));

每次我去使用请求中的 body 对象时,它都是未定义的。我的问题是app.use(bodyParser.urlencoded({ extended: false }));。那么我是如何解决的呢?我将那条线移到controllers.init(app); 上方。

所以我想再次了解这里的问题,以便将来防止它。是某种类型的 byref/byval 问题吗?在将应用程序对象传递给控制器​​后,我对它所做的所有其他更改似乎都有效。谁能解释这里发生了什么以及如何防止将来发生这种情况?

【问题讨论】:

    标签: javascript node.js express pass-by-reference pass-by-value


    【解决方案1】:

    express 创建一个管道(基于连接中间件)。本质上,每个中间件都通过调用next() 回调链接到下一个中​​间件,并且只需按照它们在您的代码中传递给app.use() 的顺序将它们堆叠起来,从而使事情变得简单。控制器处理程序(通常)是一个例外,因为它们很少调用next(),而是在对输出流执行一些操作后通过调用res.end()结束链(在您的代码中,您可能不会调用end(),但其他render()send() 这样的方法在内部调用它)。

    【讨论】:

    • 谢谢。所以总而言之,为了防止它确保你在你的控制器中调用 res.end() (我遵循的示例没有这样做),或者确保你在将它传递给之前对 app 对象做所有你需要做的事情控制器?
    • 好吧,同样不需要直接调用.end(),因为有很多函数可以在后台调用。更好的经验法则是按照您希望它们执行的顺序声明您的中间件,并且通常路由会在除错误处理中间件(按照惯例,非必要)之外的所有内容之后进行
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2012-01-21
    • 1970-01-01
    • 2020-06-30
    • 2011-06-21
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多