12

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

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

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

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

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

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

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

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

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

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

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

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

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

[Q1]:这是否有些模糊?

问题:

  • 我想让这个动态。我希望在现场需要时需要模块。这应该很容易做到,只需即时要求。

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

【Q2】你对这个有什么具体的提示吗?

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

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

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

[Q3] 你会如何处理这些隐私/安全问题?有什么方法可以在某种节点沙箱中运行用户上传的代码?访问文件系统等呢?

谢谢!

4

1 回答 1

5

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

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

  1. 定义一些路由
  2. 用 UI 定义一个“公共”目录
  3. 定义加载该模块时必须加载的特定 CSS 和 JS 文件
  4. 如果需要,可以添加特定于路由的 JSes

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

什么电炉不做

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

于 2012-09-08T00:20:26.080 回答