模块化编程和节点

Mer*_*erc 12 modularity mongoose mongodb node.js express

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

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

我想提出一种设计,允许模块以与Drupal类似的方式(但可能更好).那是:

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

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

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

[Q1]:这有些含糊不清吗?

问题:

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

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

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

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

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

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

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

谢谢!

Mer*_*erc 5

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

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

  1. 定义一些路线
  2. 使用UI定义"公共"目录
  3. 定义加载该模块时必须加载的特定CSS和JS文件
  4. 如果需要,能够添加特定于路由的JS

状态:我接受了这个答案,因为我已经完成了Hotplate的"核心"开发,这就是这个答案的重点.我仍然需要"做"事情(例如,一旦我编写了文档,我将确保"hotplate"是模块中唯一的目录,没有示例服务器).但是,基础就在那里.就"核心"而言,它只是真正错过了故事的"认证"方面(这需要大量的思考,因为我想做到这一点,以便它与数据库无关并与护照接口).Dojo小部件是一个很好的奖励,虽然这个框架可以与任何东西一起使用(事实上​​,骨干特定的代码将是sweeeeet).

什么样的热板不做:

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