从asp.mvc应用程序迁移到以devise为重点的node.js应用程序

我目前正在寻找替代平台来迁移现有的应用程序,它开始作为一个原型使用asp.mvc但大多数的代码是一个简单的ASP MVC的Web服务的JavaScript,所以我们正在考虑推进它似乎是合理的我们只是取消当前的微软堆栈,只是为了让我们有更多的自由,我们可以在Web服务和前端重用一些模型和代码,尽pipe这可能会结束只是less量。

这可能是一个相当大的问题,包括许多部分,但无论如何,我肯定会把它放在那里,因为我确信这可能会帮助许多其他人看到他们如何从.net / java移动到node.js 。 由于大多数这些静态types的语言有很多使用的模式和实践,例如控制反转,工作单元,面向方面编程等等,看起来有点奇怪,正朝另外一个平台发展,似乎并不需要这么多的结构。面积…所以我有一些担心,从我的超级结构化testing世界转移到这个新的看似非结构化和dynamic的世界。

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


路由到操作

在MVC中的这种机制似乎可以通过node.js中的Express来替代,这将使我能够将路由映射到方法。 但是有一些担忧:

  • 在ASP MVC我的控制器可以被dependency injection,并有variables,所以行动很容易testing,因为他们所依赖的一切都可以在需要时被模拟,并通过构造函数传入。 然而,因为expression式中的方法似乎没有包含范围,所以似乎我将不得不使用全局variables或在内部新buildvariables。 有没有一种很好的方式来访问这些路由方法中的业务逻辑容器?

  • 有没有办法自动绑定发送的模型? 或者至less得到一些有用的方式json / xml等? 看来,如果你发送正确的MIMEtypes的内容,它可以提取,但我没有看到这个在线的任何明确的例子。 我很高兴在Express上使用额外的框架来提供这个function,理想情况下,我只想对/user/1发出一个POST请求,并将用户对象拉出来,并用数据库中的id 1更新用户我们稍后会谈)。

  • validation正在发送的数据的最佳方式是什么? 目前在我们的前端JavaScript应用程序,我们使用KnockoutJS和所有模型使用敲除observables和validation使用Knockout.Validation。 我很高兴在节点上使用Knockout Validation,因为模型是前端和后端之间的契约,但是如果有更好的解决scheme,我很乐意去查看它。

数据库交互

目前在.net领域,我们使用NHibernate与我们的关系数据库进行通信,并使用MongoDB驱动程序与我们的MongoDB数据库进行通信。 我们使用Generic Repository模式,将查询隔离到自己的类中。 我们也使用了一个Unit Of Work模式,所以我们可以将逻辑上的单词块包装到一个事务中,然后在完成的时候全部提交,或者如果没有的话就回滚。 这使我们能够在几乎任何级别上模拟我们的对象,这取决于我们想要testing的内容,还可以让我们轻松地更改我们的实现。 所以这是我的担心:

  • Sequalize似乎很适合replaceNHibernate,但它似乎没有任何事务处理,使得很难做出一个单位的工作模式。 如果不能以同样的方式完成,那么这不是世界末日,但是我希望能够以某种方式对一大块工作进行分组,所以像CreateNewUserUnitOfWork这样的一个动作可以用一个表示用户的模型详细信息,validation它,在一个表中创build一个条目,然后在其他人创build一些关系数据等,从数据库中获取用户ID,然后发回(假设一切顺利)。 从查看QueryChainer看来,它似乎提供了大部分的function,但是如果在5个操作中的第3个操作失败,它看起来不是简单的回滚,那么是否有一些方法来获得这个级别的控制?

插件/分散的configuration数据

这对我们的应用程序来说更是一个小众关注的问题,但是我们有其他的包含插件的dll。 有放入bin文件夹,然后将挂钩到路由,数据库和validationconfiguration。 想象一下,就像拥有谷歌主页,谷歌地图,文档等都是插件,告诉主要应用程序路由额外的调用插件,然后有自己的模型和数据库configuration等方法。这里是我的关注:

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

testing

目前在应用程序中有单元,集成,验收testing。 unit testing发生在前端和后端,所以目前它将在我们的构build脚本中使用JsTestDriver进行javascripttesting,以确认所有业务逻辑如预期的那样独立运行。然后我们进行了集成testing, C#将会testing我们的控制器和动作如预期的那样工作,以及任何工作单位等等,这再一次由构build脚本启动,但也可以通过Resharperunit testing运行器运行。 然后,最后我们通过使用networking驱动程序编写的validationtesting,它只是针对前端,并通过浏览器testing所有function。 我主要关心的是:

  • 什么是testingnodejs的最佳实践和框架? 目前在ASP层进行testing的大多数testing都是通过C#脚本来完成的,创build控制器时使用模拟的依赖关系,并运行动作来certificate它使用MVC Helper等等。然而,我想知道NodeJS对此有何支持,因为它看起来并不简单(快速浏览一下)来testingnode.js组件,而无需运行节点。

  • 假设有一些好的方法来testingnode.js,这可以通过命令行运行程序钩入到构build脚本中吗? 因为我们希望所有事情都尽可能自动化和隔离。


我很欣赏,这更像是5个以上的小问题,而成为一个更大的问题,但作为一个基本的问题,如何实现一个大型节点js应用程序的良好devise,我希望这仍然是有用的,像很多人喜欢自己来自大型企业应用程序到节点js风格的应用程序。

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

我不能给你所有你想要的信息,但我强烈推荐Sequelize作为ORM和摩卡(用expect.js和sinon)来进行testing。 Sequelize将在下一个版本1.7.0中添加事务支持。 我不喜欢QueryChainer,因为它的每个元素都是分开执行的。

作为一个testing框架,我感到沮丧,在验收testing后,遗漏了AfterAll方法来closuresExpress服务器。 摩卡由Express的作者开发。

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

你可能也会很喜欢https://github.com/visionmedia/express-resource ,它提供了一个RESTful接口来访问你的模型。 为了validation,我想你会很高兴与https://github.com/ctavan/express-validator

为什么你需要testingNode模块而不使用Node? 用Makefile调用一个testing脚本被认为是标准的,你可以在提交之前添加一个预先提交的钩子到git来运行testing。