模块化编程和节点

Modular programming and node

提问人:Merc 提问时间:9/1/2012 最后编辑:Merc 更新时间:1/23/2013 访问量:1637

问:

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

更新2:我在这方面取得了巨大的进展。我即将在 GitHub 上提交大量代码,这将允许人们使用 Node 和 Express 进行非常非常好的模块化编程(模块同时公开客户端和服务器端代码)。敬请期待。

更新 3:我将这个东西重写为一个系统来注册模块并使它们能够通过事件/钩子系统进行通信。它来得非常好。我已经有大量的代码了——我只是把它移植到新系统上。请随时查看 GitHub 上的项目:https://github.com/mercmobily/hotplate )

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

更新5:该模块越来越接近可用的东西。我实现了一个新的加载器,它将考虑 init() 函数将调用 All() 的内容——并确保首先加载提供该钩子的模块。这将电炉提升到一个全新的水平。

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

我正在写一些东西,它可能会变成一个相当大的软件。简而言之,它是 nodejs + Express + Mongodb/Mongoose + Dojo(客户端)。

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

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

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

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

初始架构可以是这样的:

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

[Q1]:这有点理智吗?

问题:

  • 我想让这个充满活力。我希望在现场需要时需要模块。这应该很容易做到,需要即时操作。

  • server/node.js 将调用一个函数,但该函数感觉/看起来很像路由器本身

[问题2]你对此有什么具体的提示吗?

这些似乎不是太大的问题。但是,当您谈论安全性时,真正的问题就来了。

  • 隐私。这是一个令人讨厌的。目前,所有调用都将按workspaceId对mongoDb进行筛选。我想强制执行某种方式,以便模块无法明确访问数据库,以便每个模块都无法访问属于其他工作区的数据

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

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

谢谢!

节点 .js MongoDB Express 猫鼬 模块化

评论

0赞 badunk 9/4/2012
你看过哈里普索CMS吗?(calip.so)我相信部分设计的灵感来自Drupal。不幸的是,它似乎最近没有得到维护。
0赞 Merc 9/7/2012
这更像是一个CMS。我所追求的是一种开发通用模块的模块化方法,这些模块适用于客户端和服务器端。我想我做到了!
0赞 badunk 9/8/2012
很高兴看到你解决了它,但是 calip.so 确实有一个事件驱动的模块系统。当然,您也必须购买CMS部分。
0赞 mkoryak 9/8/2012
@Merc:想要赏金吗?回答这个问题,这样我就可以给你了
0赞 Merc 9/8/2012
@mkoryak:真的很想要这个赏金。但是,在至少我为 Hotplate 编写的大多数模块都可以正常运行之前,我无法真正回答这个问题。今天将尝试这样做。badunk:对不起,我不太清楚。我一直在追求一个专注于轻量级解决方案的东西,以创建适用于客户端/端和服务器端的模块。

答:

5赞 Merc 9/8/2012 #1

最后,我自己回答了这个问题——艰难的方式。 答案是:电炉,https://github.com/mercmobily/hotplate

它完成了我上面描述的大部分工作。更重要的是,使用 hotPlate(使用 hotPage 和 hotClientPages,默认可用),您可以编写一个模块,该模块

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

状态 .. 我接受这个答案,因为我已经完成了 Hotplate 的“核心”的开发,这就是这个答案的重点。我仍然需要“做”一些事情(例如,一旦我编写了文档,我将确保“hotplate”是模块中的唯一目录,而那里没有示例服务器)。然而,基础就在那里。就“核心”而言,它只是真正缺少了故事的“身份验证”方面(这需要很多思考,因为我想让它与数据库无关并与护照交互)。Dojo 小部件是一个很大的好处,尽管这个框架可以与任何东西一起使用(事实上,特定于主干的代码将是 sweeeeet)。

电炉不做什么

What hotplate DOESn'T do, is give users the ability to upload modules which will then be loaded in the application. This is extremely tricky. The client side wouldn't be so bad (the user could define Javascript to upload, and there could be a module to do that, no worries). The server side, however, is tricky at best. There are just too many things that can go wrong (the client might upload a blocking piece of code, or they could start reading the file system, they would have access to the full database, and so on). The solution to these issues are possible, but none of them are easy (you can cage the user's node environment and get it to run on a different port, for example, and so on) but some problems will stay. But, there is always hope.