模块化编程和节点

时间:2012-09-01 15:47:38

标签: node.js mongodb express mongoose modularity

更新1 :我在这方面取得了很多进展。关于允许用户上传模块的想法,我几乎放弃了(至少现在,但可能是长期的)。但是,我正在开发一个结构,以便可以定义和加载几个模块。一个模块将被初始化,设置自己的路线,并有一个公共"要提供的Javascript目录。我越是看到它,我就越能意识到我可以(应该)在一个名为" system"的模块中移动现在系统范围内的调用。

更新2 :我已经取得了巨大的进展。我即将在GitHub上提交大量代码,这将允许人们使用Node和Express进行真正的,非常好的模块化编程(使用暴露客户端和服务器端代码的模块)。请继续关注。

更新3 :我把这个东西改写为注册模块的系统,并使它们能够通过事件/钩子系统进行通信。它非常非常。我已经有很多代码了 - 我只是将它移植到新系统中。请随意查看GitHub上的项目:https://github.com/mercmobily/hotplate

更新4 :这很好。事实证明,我对作为客户端和服务器的模块的想法确实有效。

更新5 :模块越来越接近可用的东西。我实现了一个新的加载器,它将考虑init()函数将invokeAll() - 并将确保提供该钩子的模块将首先加载 。这使得电热板达到了一个全新的水平。

更新6 :Hotplate现在接近12000行代码。当它完成时,在2月的某个时候,我想它将接近20000行代码。它做了很多东西,这一切都是从StackOverflow开始的!我需要它来开发我自己的SaaS,所以我真的需要在二月份之前完成它(这样我就可以冲刺到七月并完成第一个版本的BookingDojo)。谢谢大家!

我正在写一些可能会变成一个非常大的软件的东西。简短的故事是它的nodejs + Express + Mongodb / Mongoose + Dojo(客户端)。

注意:本文中的问题标记为[Q1],[Q2]等。

来自Drupal背景(并且知道它是如何进化的,我想避免的东西),我有点像模块怪物。目前,我已经完成了应用程序的样板(电炉:https://github.com/mercmobily/hotplate)。它完成了所有无聊的工作(用户,工作空间,密码提醒等),并且它缺少了很多部分。

我想提出一种设计,允许模块与Drupal类似(但可能更好)。那就是:

  • 模块可以定义新路由并处理它们
  • 模块在系统范围内安装,然后每个工作区都可以启用它们的集合列表

最初的架构可能是这样的:

  • A" modules"目录,每个模块有一个目录
  • 每个模块都有一个" public"的目录。 Javascript方面的文件
  • 每个模块都有public / startup.js,它们将包含在应用程序的javascript中
  • 每个模块都有server / node.js,如果/需要的话,它将由服务器随时包含
  • 将定义一个路由,例如/app/:workspaceid/modules/MODULE_NAME/.*,其中一个中间件检查该工作区是否启用了MODULE_NAME - 如果是,则调用模块的功能使用传递的参数

[Q1]:这有点模糊吗?

的问题:

  • 我想让这个充满活力。我希望当场需要模块。通过动态要求,这应该很容易做到。

  • server / node.js会有一个叫做的函数,但是这个函数感觉/看起来很像路由器本身

[Q2]你有关于这个的具体提示吗?

这些似乎不是太令人担忧。但是,当你谈到安全性时,真正的问题出现了。

  • 隐私。这是一个讨厌的。目前,所有调用都将通过workspaceId对mongoDb进行正确的查询。我想以某种方式强制执行,以便模块无法清楚地访问数据库,因此每个模块都无法访问属于其他工作区的数据

  • 用户定义的模块。我会让用户能够上传他们自己的模块(并可能让其他用户可以使用)。但是,这实际上意味着允许人们上传节点本身执行的代码!你会怎么做?

[问题3]您如何处理这些隐私/安全问题?有没有办法在某种节点沙箱中运行用户上传的代码?如何访问文件系统等?

谢谢!

1 个答案:

答案 0 :(得分:5)

最后,我自己回答了这个问题 - 这很难。 答案:hotplate,https://github.com/mercmobily/hotplate

它完成了我上面描述的大部分内容。更重要的是,使用hotPlate(使用hotPage和hotClientPages,默认情况下可用),你可以编写一个模块

  1. 定义一些路线
  2. 使用UI定义“公共”目录
  3. 定义加载该模块时必须加载的特定CSS和JS文件
  4. 如果需要,可以添加特定于路由的JS
  5. 状态: 我接受了这个答案,因为我已经完成了Hotplate的“核心”的开发,这就是这个答案的重点。我仍然需要“做”事情(例如,一旦我编写了文档,我将确保“hotplate”是模块中唯一的目录,没有示例服务器)。但是,基础就在那里。就“核心”而言,它只是真正错过了故事的“认证”方面(这需要大量的思考,因为我想做到这一点,以便它与数据库无关并与护照接口)。 Dojo小部件是一个很好的奖励,虽然这个框架可以与任何一起使用(实际上特定于主干的代码将是sweeeeet)。

    什么样的热板不做

    什么样的热板不做,是让用户上传模块然后加载到应用程序中的能力。这非常棘手。客户端不会那么糟糕(用户可以定义要上传的Javascript,并且可能有一个模块可以做到这一点,不用担心)。然而,服务器端充其量是棘手的。有太多可能出错的事情(客户端可能会上传阻塞的代码,或者他们可以开始阅读文件系统,他们可以访问完整的数据库,等等) 。 这些问题的解决方案是可能的,但它们都不容易(例如,您可以保留用户的节点环境并使其在不同的端口上运行,等等)但是一些问题将会解决留。但是,总有希望。