【问题标题】:Modular programming and node模块化编程和节点
【发布时间】:2012-08-27 02:07:06
【问题描述】:

更新 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 背景(并且知道它已经进化到多么复杂,这是我想避免的),我有点模块狂。目前,我已经完成了应用程序的样板(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] 您会如何处理这些隐私/安全问题?有什么方法可以在某种节点沙箱中运行用户上传的代码?访问文件系统等呢?

谢谢!

【问题讨论】:

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

标签: node.js mongodb express mongoose modularity


【解决方案1】:

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

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

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

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

电炉不能做什么

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

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 2016-04-26
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多