Node.js 快速路由和控制器有什么区别?

2024-01-09

与传统的快速路线控制器相比,有什么不同或更强大的地方吗?

如果您有一个 Express 应用程序并定义了模型,那么它是否会成为 MVC 应用程序,还是还有更多必要?

我只是想知道我是否因为不升级到更合法的“控制器”而错过了节点表达应用程序中的额外/更简单的功能。如果有这样的事情的话。

Thanks!

编辑:为了澄清,如果您使用这样的路线:

// routes/index.js
exports.module = function(req, res) {
  // Get info from models here, 
  res.render('view', info: models);
}

它与控制器有何不同?控制器能够做更多事情吗?


首先,express 中的路由是 connect 中定义的中间件。 Express与其他框架的区别在于,中间件大多位于控制器前面,由控制器结束响应。 Express 使用中间件的另一个原因是 Node.js 异步的本质。

让我们看看 Javascript 中的控制器是什么样子的。

var Controller = function () { };

Controller.prototype.get = function (req, res) {

  find(req.param.id, function (product) {

    res.locals.product = product;

    find(res.session.user, function (user) {

      res.locals.user = user;
      res.render('product');

    }); 

  }); 

};  

关于此 get 操作,您可能注意到的第一件事是嵌套的回调。这很难测试,很难阅读,如果你需要编辑内容,你需要修改你的缩进。因此,让我们通过使用流量控制来解决这个问题并使其平坦。

var Controller = function () { };

Controller.prototype.update = function (req, res) {

  var stack = [

    function (callback) {

      find(req.param.id, function (product) {
        res.locals.product = product;
        callback();
      });


    },

    function (callback) {

      find(res.session.user, function (user) {
        res.locals.user = user;
        callback();
      });

    }

  ];

  control_flow(stack, function (err, result) {
    res.render('product');
  });

}

在此示例中,您可以提取堆栈的所有不同功能并测试它们,甚至将它们重新用于不同的路由。您可能已经注意到控制流结构看起来很像中间件。因此,让我们在路线中用中间件替换堆栈。

app.get('/',

  function (req, res, next) {

    find(req.param.id, function (product) {
      res.locals.product = product;
      next();
    });

  },

  function (req, res, next) {

    find(res.session.user, function (user) {
      res.locals.user = user;
      next();
    });

  },

  function (req, res, next) {
    res.render('product');
  }

);

因此,虽然从技术上讲,express.js 中可以有控制器,但您可能会被迫使用流控制结构,这最终与中间件相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 快速路由和控制器有什么区别? 的相关文章

  • 从express.js 中删除所有标头

    我正在创建一个页面 其中有一些数据可以由另一个设备解析 我曾经使用 php 执行此操作 但现在将其移至 Node js 我需要从页面中删除所有标题 这样我就只有我的输出 此输出是对 GET 请求的响应 此刻我有 HTTP 1 1 200 O
  • 如何调试 Node.js 中的标头发送错误

    我得到了很多Can t set headers after they are sent错误 他们似乎从来没有给我我的行号app js 这正常吗 人们如何调试这些错误 我抛出标题错误的代码看起来像这样 它是否做了一些奇怪的事情来隐藏行号 ap
  • net.Socket.writable、net.Socket.readable 属性不是官方 Node.js API 的一部分

    我想知道为什么 net Socket writable 和 net Socket read 属性不是官方 Node js API 的一部分 这是否意味着最好不要使用这些属性 因为它是将来可能会改变的内部内容 它们是 但不是你正在寻找的地方
  • 如何从 typescript 使用 npm 模块?

    我正在尝试打字稿 它在 hello world 阶段运行良好 我现在尝试使用 npm 模块 index ts import require lodash console log toUpper Hello world 这不起作用 tsc i
  • 从 NodeJS 运行 localhost 服务器时出现 ECONNREFUSED

    我在本地计算机上启动并运行了一个 NodeJS 服务器 该服务器正在侦听端口 50000 从也在我的本地计算机上运行的另一台服务器 我需要向该服务器发出一个简单的 GET 请求 但我得到的只是 ECONNREFUSED 错误 Error c
  • 导入JavaScript模块时什么时候需要添加文件扩展名?

    导入模块时 我注意到有时导入的文件有扩展名 例如 import myFunc from foo js 而其他库 导入不会 import myFunc from foo 这与 ES 模块与 CommonJS 模块有关吗 这取决于你的运行时和编
  • Lodash 根据键对对象列表进行排序

    我正在寻找基于键对对象列表进行排序 这是我的对象 var Categories social id social 001 lastModified 2 Day ago communication id communication 001 l
  • Passport-azure-ad,它是否解析并验证令牌?

    我的 MEAN 堆栈应用程序使用 Azure AD 进行身份验证 我在用 护照天蓝色广告 Web api 身份验证模块 基于在这里发帖和回复 https stackoverflow com questions 36653812 passpo
  • 猫鼬模式创建

    我刚刚开始使用猫鼬 我有一个使用 mongoose 的创建脚本 它使用示例数据创建模式和数据库 现在我编写实际的应用程序 我是否需要在每次应用程序运行时创建架构对象 或者它是否已经以某种方式可用 换句话说 我是否需要在每个使用 mongoo
  • Electron - 如何使用主进程和渲染进程

    此时 经过大量研究和谷歌搜索 我了解了 main 和 renderer 的作用 以及它们在 Electron 应用程序中的重要性 然而 我在这里向所有有知识的人发出我的请求 请给我一个机会clear解释如何在我的应用程序中具体实现这一点 我
  • 在 Nodejs Express 上无法访问该网站?

    我对 Node 完全陌生 我尝试在托管 centos 7 vultr com 上运行一个测试站点 我已经安装了nodejs express Hello js const express require express const app e
  • 环境变量未加载到 Nodejs 中的 process.env

    我正在构建一个nodejs api 并设置了dotenv打包为开发依赖项以将变量加载到process env在开发人员的本地计算机上 请注意 当我登录时 我使用sudo i作为root 我的目的是在部署过程中 环境变量将在我的 Ubuntu
  • 通过 npm 节点自动化 Git 提交 + 版本控制 + 标记

    我一直试图得到的是 使用 npm version 来更新 package json 并创建一个标签 然后提交我的更改 通过这种方式 我将能够按版本添加标签 自动版本控制并提交信息 我遇到的问题是 当我使用 npm 版本时 它会自动执行标记
  • 我应该在客户端和服务器上都使用 MVC 吗?

    我决定在我的网站上使用 MVC 模式 所以 现在我在我的网站上使用 Backbone js 框架 我网站上的所有操作都是ajaxy 所以server只从db获取数据 并将数据保存到db 我是否也需要在服务器端使用 MVC 这让一切都变得复杂
  • nodeJS 防止 res.download 超时

    我对我的 nodeJS 服务器进行了 POST 调用 该服务器在 mongo 数据库上搜索一些数据并返回包含所请求数据的 CSV 文件 问题是数据搜索和处理超过了nodeJS默认的2分钟超时 在不同的场景中 y 使用 res writeHe
  • 如何解决 fs.existsSync 不是函数

    在 NodeJS 中我有 const fs require fs if fs existsSync some path 但我收到错误 类型错误 fs existsSync 不是函数 经过一番搜索后 我读到了Webpack自带require哪
  • 使用 PassportJS 时将用户序列化/反序列化到会话中的目的是什么?

    使用 PassportJS 时将用户序列化 反序列化到会话中的目的是什么 我以前用过JSP 似乎对这些东西没有概念 它控制如何将用户实例保存到会话存储中 例如连接 redis https github com visionmedia con
  • 如何防止 babel 转译生成器函数

    我对 babel 有一个奇怪的问题 当我在我的一个类中使用一个简单的生成器函数时 babel 会创建一个函数 其中包含对regeneratorRuntime var marked3 0 getQueryDummy map regenerat
  • mime.lookup 的 webrtc 错误

    我在我的电脑上尝试了 webrtc 演示 但在演示步骤 04 中 当我使用 npm install 和 node index js 时 它显示 类型错误 mime lookup 不是一个函数 即使我通过输入 npm install mime
  • Mongo JSON 文档 -> JSON -> BSON

    我正在使用 Node js 构建一个使用 mongodb 的 Web 套接字服务器 我使用 node mongodb native 作为访问 mongodb 的库 当我对数据库中的对象调用 console log sys inspect i

随机推荐

  • 如何在 ASP.NET 3.5 中对每个 http 请求进行缓存

    我们使用 ASP NET 3 5 基于控件的方法 并且只需要特定于一个 http 请求的存储 使用会话 id 中的键的线程特定缓存将不起作用 因为线程应该被池化 因此我有机会在缓存中获得来自某些先前请求的数据 这在我的情况下是不可取的 我总
  • 在python中组合两个循环

    假设有两个多边形 p1 和 p2 其中 p2 完全在 p1 内部 p1 0 10 10 10 10 0 0 0 p2 2 6 6 6 6 2 2 2 degree of contact 0 xyarrays p1 p2 p1 degree
  • asp.net 中的 GridView 标题文本

    我想使用 Design 更改 gridview 的标题文本
  • Terminal.app 可以遵循 ANSI 转义码吗?

    我注意到 随着TERM环境变量设置为xterm or xterm 256colorMac OS X 的 Terminal app 实用程序尊重大多数 ANSI 转义码 至少当这些转义码涉及更改文本颜色时 例如 echo e 033 0 31
  • 我可以使用 C# 在 Sharepoint 2010 中为计算字段创建自己的公式吗

    我想使用 Visual Studio 2010 以 C 语言为 Sharepoint 2010 创建一个以编程方式计算的字段 有没有办法设置一个公式来调用我自己的函数并将结果返回到字段 我的场景 假设我想创建一个始终返回其他两个字段之间的总
  • 发件人证书在签名验证之前已过期

    我正在开发一个关于 Java 中的证书和数字签名的项目 但我无法理解以下情况 文件发送者和接收者的证书在创建签名时有效 但当接收者收到文件时 发送者的证书已过期 这种情况是否有效 接收者可以正常验证签名 还是不能 还有一个问题 不可否认密钥
  • GLMakie 图 x 轴的量化失真。为什么?

    我使用创建一个简单的图GLMakie GLMakie scatter range 3e 9 1e 3 3e 9 1e 3 100 range 1 100 100 结果如下 看起来 x 轴被严重量化了 这Plots包可以很好地处理相同的命令
  • libpng 在 png_read_info() 上崩溃

    我正在尝试在 vs2013 中使用 libpng 1 2 10 读取 png 文件 我下载了最新的zlib并编译了pnglib 运行良好 现在我正在尝试加载一个文件 int w width int h height const char n
  • 在 Android 的异步任务线程中调用 invalidate 时出现问题!

    我试图从 asynctask 线程调用 invalidate 我收到此错误 10 18 15 14 30 469 错误 AndroidRuntime 889 导致 android view ViewRoot CalledFromWrongT
  • 如何获取 Lucene 索引中文档子集的顶级术语?

    我知道可以获取 Lucene 索引中的顶级术语 但是有没有办法根据 Lucene 索引的子集获取顶级术语 IE 特定日期范围内的文档索引中最重要的术语是什么 理想情况下 应该有一个实用程序可以执行此操作 但我不知道有这样的实用程序 然而 以
  • 根据字符集对单词进行聚类

    假设有一个单词集 我想根据它们的字符包 多重集 对它们进行聚类 例如 茶 吃 阿爸 阿阿 你好 将被聚类成 茶 吃 abba aabb 你好 abba and aabb聚集在一起是因为它们具有相同的字符包 即两个a和两个b 为了提高效率 我
  • 适用于 Windows 和 Mac 的 Node.js — 正斜杠、反斜杠修正

    有没有一种方法可以纠正从 Windows 到 Linux 和 Mac 的 Node js 中有关反斜杠与正斜杠的差异 Windows 在调用以下位置时需要反斜杠git bash 而 Mac Linux 需要正斜杠 我正在与 Mac 和 Wi
  • 如何将支持库小吃栏文本颜色设置为 android:textColor 以外的颜色?

    因此 我开始在设计支持库中使用新的 Snackbar 但我发现当您在主题中定义 android textColor 时 它会应用于 Snackbar 的文本颜色 如果您的主要文本颜色是深色 这显然是一个问题 有谁知道解决这个问题的方法或者对
  • 带有 ngmodel 的 Angular 2 动态表单示例导致“表达式在检查后已更改”

    我正在寻找使用这个example https angular io docs ts latest cookbook dynamic form htmlAngular 文档中提供了与 ngmodel 结合使用动态表单的功能 以便动态表单控件可
  • 路由器 waitOn 在每次渲染时等待订阅

    我有一条路线waitOn返回一个钩子Meteor subscribe 每次触发路线时 我都会看到我的旋转器loadingTemplate在查看实际数据之前先简单介绍一下 我本以为我只需要等待订阅下载一次 即第一次 如果我做错了 请提出更好的
  • 如何使用 Files.lines(...).forEach(...) 读取文件?

    我目前正在尝试从我拥有的纯文本文件中读取行 我在另一个 stackoverflow 上发现 用Java读取纯文本文件 https stackoverflow com questions 4716503 best way to read a
  • Angularjs ui 路由器正则表达式

    我正在尝试匹配 1 个可以有 2 种值的参数 当前 或至少包含 10 个密码的数字 我试过了 url history code current 0 9 10 当我使用这个正则表达式时 我的应用程序会转到history current 但是当
  • 克服 Windows Azure Sql 数据库 150 GB 大小限制

    SQL Azure 的数据库大小限制为 150 GB 我已多次阅读他们的文档并在网上搜索 但我不清楚这一点 使用联合是否允许开发人员超越 150 GB 的数据库 例如我可以有几个 150GB 的联邦成员吗 如果没有 我如何在 Windows
  • js 中的脚本

    我有一个jsp页面 我根据请求参数动态添加一些内容到页面 请求将返回一个数组 基于此我必须创建一个下拉列表 我想在更改另一个下拉菜单时执行此操作 因此只能使用 javascript 来完成 但我无法在 js 中使用 scriptlet 这真
  • Node.js 快速路由和控制器有什么区别?

    与传统的快速路线控制器相比 有什么不同或更强大的地方吗 如果您有一个 Express 应用程序并定义了模型 那么它是否会成为 MVC 应用程序 还是还有更多必要 我只是想知道我是否因为不升级到更合法的 控制器 而错过了节点表达应用程序中的额