1

我目前正在寻找将现有应用程序迁移到的替代平台,它最初是使用 asp.mvc 的原型,但大多数代码是带有简单 asp mvc Web 服务的 javascript,因此我们正在考虑将其向前推进,这似乎是明智的我们只是废弃了当前的 microsoft 堆栈,转而使用 nodejs,这让我们可以更自由地在何处以及如何托管我们的应用程序,而且我们可以在 Web 服务和前端中重用一些模型和代码,尽管这可能会结束最多是少量。

这可能是一个包含许多部分的相当大的问题,但无论如何我都会把它放在那里,因为我相信这可能对许多其他人了解他们如何从 .net/java 之类的东西迁移到 node.js 有所帮助. 由于这些静态类型语言中的大多数都使用了许多模式和实践,例如控制反转、工作单元、面向方面编程等,因此转向另一个似乎不需要太多结构的平台似乎有点奇怪领域...所以我对从我的超级结构化和测试的世界迁移到这个看似非结构化和动态的新世界有些担忧。

所以这是我在 MVC 中要做的主要事情,并且目前想在 node.js 中做,但我不太确定实现相同级别的分离或功能的最佳方法。


路由到操作

ASP MVC 中的这种机制似乎可以被 node.js 中的 Express 替换,这将使我具有将路由映射到方法的相同能力。但是有几个问题:

  • 在 ASP MVC 中,我的控制器可以进行依赖注入并具有变量,因此操作很容易测试,因为它们所依赖的所有内容都可以在需要时进行模拟并通过构造函数传入。但是,由于 express 中的方法似乎没有包含范围,因此我似乎必须使用全局变量或在内部更新变量。有没有一种很好的方法可以在这些路由方法中访问我的业务逻辑容器?

  • 有没有办法自动绑定正在发送的模型?或者至少以某种有用的方式获取 json/xml 等?看来,如果您发送带有内容的正确 mime 类型,它可以被提取,但我没有在网上看到任何明确的例子。我很高兴在 Express 之上使用其他框架来提供此功能,因为理想情况下,我只想发出 POST 请求/user/1并拉出用户对象并更新数据库中 id 为 1 的用户(我们将讨论不久)。

  • 验证正在发送的数据的最佳方法是什么?目前在我们的前端 javascript 应用程序中,我们使用 KnockoutJS,所有模型都使用敲除 observables,并使用 Knockout.Validation 进行验证。我很高兴在节点上使用 Knockout Validation,因为模型是前端和后端之间的合同,但是如果有更好的解决方案,我很乐意去研究它。

数据库交互

目前在 .net 领域,我们使用 NHibernate 与我们的关系数据库进行通信,并使用 MongoDB 驱动程序与我们的 MongoDB 数据库进行通信。我们使用通用存储库模式并将查询隔离到它们自己的类中。我们还大量使用了工作单元模式,因此我们可以将单词的逻辑块包装到事务中,然后如果顺利则全部提交,如果不顺利则回滚。这使我们能够根据我们想要测试的内容在几乎任何级别模拟我们的对象,也让我们可以轻松地更改我们的实现。所以这是我的担忧:

  • Sequalize 似乎很适合替换 NHibernate,但是它似乎没有任何类型的事务处理,因此很难制作一个工作单元模式。如果不能以相同的方式完成,这不是世界末日,但我想要某种方式能够以某种方式对一大块工作进行分组,因此像 CreateNewUserUnitOfWork 这样的操作将采用代表用户的模型详细信息,验证它,在一个表中创建一个条目,然后在其他表中创建一些关系数据等,从数据库中获取用户 ID,然后将其发回(假设一切顺利)。从 QueryChainer 看来,它似乎提供了大部分功能,但如果它在 5 次操作中的第 3 次失败,则回滚似乎并不容易,那么有什么方法可以获得这种级别的控制吗?

插件/分散的配置数据

这更多是我们应用程序的一个小众问题,但我们有中央应用程序,然后是其他包含插件的 dll。将它们放入 bin 文件夹,然后将连接到路由、数据库和验证配置。想象一下它就像拥有谷歌主页,谷歌地图、文档等都是插件,它们告诉主应用程序将额外的调用路由到插件中的方法,然后它们有自己的模型和数据库配置等。这是我对此的担忧:

  • 似乎有一种方法可以通过扫描目录中的新插件并包含它们来更新路由(node.js 需要文件夹中的所有文件?)但是有一些最佳实践来做这种事情,因为我没有希望每个请求都必须不断进行目录扫描。可以安全地假设我很高兴在启动节点应用程序时将插件放在正确的位置,因此目前无需在运行时添加插件。

测试

目前在应用程序中有单元、集成、验收测试。单元测试发生在前端和后端,所以目前它将在我们的构建脚本中使用 JsTestDriver 进行 javascript 测试,以确认所有业务逻辑都按预期独立工作等。然后我们有集成测试,目前都在C# 将测试我们的控制器和操作是否按预期工作以及任何工作单元等,这再次由构建脚本启动,但也可以通过 Resharper 单元测试运行程序运行。最后,我们使用 Web 驱动程序用 c# 编写验收测试,该驱动程序仅针对前端并通过浏览器测试所有功能。我对此的主要担忧是:

  • 测试 nodejs 的最佳实践和框架是什么?目前,在 ASP 层进行测试的大多数测试都是通过 C# 脚本执行的,创建具有模拟依赖项的控制器并运行操作以证明它使用 MVC Helpers 等按预期工作。但是我想知道 NodeJS 对此有什么级别的支持,因为在没有节点运行的情况下测试 node.js 组件似乎并不简单(快速浏览)。

  • 假设有一些测试 node.js 的好方法可以通过命令行运行器等将其挂接到构建脚本中吗?因为我们希望一切尽可能自动化和隔离。


我很欣赏这更像是把 5 个以上的小问题合并成一个更大的问题,但由于基本问题是如何使用大型节点 js 应用程序实现良好的设计,我希望这对很多喜欢我自己的人仍然有用从大型企业应用程序到节点 js 风格的应用程序。

4

1 回答 1

3

我最近从 ASP MVC 切换到 Node.js,强烈建议切换。

我无法为您提供您正在寻找的所有信息,但我强烈建议您将 Sequelize 作为 ORM 和 mocha(使用 expect.js 和 sinon)进行测试。Sequelize 正在下一个版本 1.7.0 中添加事务支持。我不喜欢 QueryChainer,因为它的每个元素都是单独执行的。

我对 Jasmine 作为测试框架感到沮丧,它缺少在验收测试后关闭 Express 服务器的 AfterAll 方法。Mocha 由 Express 的作者开发。

如果您想在插件中加载 Express 服务器,您可以使用这样的单例模式:https ://github.com/JeyDotC/articles/blob/master/EXPRESS%20WITH%20SEQUELIZE.md

您可能还会非常喜欢https://github.com/visionmedia/express-resource,它提供了一个 RESTful 接口来访问您的模型。对于验证,我认为您会对https://github.com/ctavan/express-validator感到满意

为什么需要在不使用 Node 的情况下测试 Node 模块?使用 Makefile 调用测试脚本被认为是标准的,您可以在 git 中添加一个 pre-commit 挂钩以在提交之前运行测试。

于 2013-04-06T00:33:49.193 回答