【问题标题】:Architecture recommendations & guidelines for a Node.js web application? [closed]Node.js Web 应用程序的架构建议和指南? [关闭]
【发布时间】:2013-03-19 12:21:13
【问题描述】:

我渴望开始一个用于学习目的的辅助项目,并且我正在寻求一些关于使用哪些技术/框架/库以及如何构建应用程序的指导,至少是在较高层次上。我是一名前端开发人员,虽然我在服务器端编程、数据库等方面做过一些杂项工作,但这将是我第一次尝试亲自创建一个全栈应用程序。我决定使用 Node.js 作为服务器端环境,但这是我唯一的坚定要求。

我已经想出了一个应用程序的想法。以下是有关其功能的一些说明:

  • 这是另一个待办事项列表应用程序。它与您的基本清单的主要区别在于它对GTD system 的某些方面的适应,以及列表的嵌套/树结构(与平面列表或 GTD 使用的单层嵌套相反)。我使用了树的比喻,树干是列表的基础,分支是项目和子项目,叶子是单独的任务。
  • 项目(分支)可以有很多子项目(其他分支的分支),项目和子项目都可以有很多任务(叶子)。项目是您最终可以完成的任何多步骤过程,但您实际上无法执行。与 GTD 一样,您只能执行定义为物理动作的任务。例如,“获得银行贷款”是一个项目(这是一个可定义的目标),“研究贷款人的利率”是一个子项目(它推动您完成该目标),以及“致电当地的富国银行分行” “访问chas.com 的借贷部分”和“向 Bob 发送电子邮件以获得他的推荐”都是任务(它们是您可以采取的具体物理动作来推进项目/子项目)。
  • 一旦您完成了项目中的所有任务(修剪了所有叶子),该项目即被视为完成(分支被切断)。您的目标是不断修剪树木以防止其过度生长。
  • 如果你像我一样,你有一个庞大的项目列表,这些项目永远完成并被新项目取代。除了存储您的列表之外,此应用程序的价值还在于它能够指导您下一步工作。为此,您可以为每个任务定义各种元数据(仅针对任务;您不能对项目执行此操作,因为它们只是用于组织任务组的存储桶)。
  • 此元数据包括有关您可以排序和搜索的每个任务的附加信息。例如:
    • 背景:完成任务需要哪些工具/情况?例如,要更新您的驾照,您可能需要填写完整的文书工作,并且在工作日工作时间内在特定地点。
    • 截止日期:是否可以随时完成,或者是否有严格的完成日期?
    • 重要性:这是您想要做的事情,还是您需要做的事情?
    • 时间:您估计完成任务需要多长时间?
  • 鉴于此元数据,您可以随时打开应用程序,并根据您当前(或即将到来的)上下文、即将到来的截止日期、哪些任务最重要、您还有多少时间来快速确定下一步要做什么下一个承诺等。这使您不必日复一日地扫描相同的平面列表,并进行相同的心理计算,而无需任何有组织/存储的关于每个任务的元数据。您可以查看即将到来的截止日期以确定下一步需要完成的工作,也可以选择当前可用的资源,从而将列表缩小到可以完成的任务。

此应用程序中的实用程序将来自其易用性/使用速度以及在简单性和可扩展性之间取得适当的平衡。对于前一点,您应该能够在适当的位置编辑项目/任务描述,单击以切换元数据,拖放以将任务移动到不同的项目等。应该有最小的列表管理开销。对于后一点,您应该只需要输入您关心或对您有用的每个任务的元数据,从而尽可能多地使用应用程序。如果您只想使用该应用程序来记录和更新您的列表项,那很好;如果您想精细地管理截止日期,指定每个任务的重要性等,那也没关系。你投入的越多,得到的越多,但除了每个项目/任务的简单行项目描述之外,没有强制数据输入。

这一切都向我暗示了一个单页网络应用程序(理想情况下,最终对移动设备友好)在后台永久保存。您应该能够登录,移动一些东西,将一些东西标记为已完成,然后关闭它。没有手续,就像一个书面清单。这将是一个不断发展的列表,最终应该可以节省您的时间,而不是增加额外开销来跟踪您所有的日常小任务。

因此,鉴于所有这些,我正在寻求一些有关如何开发此应用程序的建议;本质上,如何构建它。我应该使用 Ember.js 或 Backbone.js 之类的客户端 MVC 框架吗?哪种数据库最适合存储此类数据,我的架构应该是什么样的?如何处理 CRUD/REST 和路由?作为一个单页应用程序,我是否必须求助于一个巨大的控制器?我在服务器和浏览器之间传输的数据是什么样的?同样,我唯一的艰难决定是在服务器上使用 Node.js,因为这项工作的重点主要是利用我的 JavaScript 技能进一步深入堆栈(并希望提出一个有用的应用程序!) .其他一切都欢迎推荐。

鉴于您的建议,我相信我可以深入研究这些技术的细节并弄清楚这些部分的适用性;我现在几乎不知所措,因为对于如何构建应用程序有很多选项和方法,虽然我在 Rails 视图中到处修复了一个错误,但我'从未构建过完整的应用程序;我不完全理解这一切如何结合在一起的基本原理。我希望得到一些反馈,例如“列表中的每个任务都可以是一个文档;使用 Redis 存储一个带有任务属性的 JSON 对象,当用户在浏览器中更新任务时,编写并发送这个对象从客户端到您的控制器以更新 Redis 文档”。这可能是完全的恶意,但希望你明白这一点。任何指向教程、演示或其他示例的链接也非常感谢 - 我已经阅读和观看了很多,但我似乎永远无法将这些更一般的解释映射到我的特定用例。

如果我有什么特别幼稚的地方,或者我遗漏了任何重要的细节,或者我的要求是否不完全清楚,请告诉我。

我也意识到这类问题不是 SO 的理想用例,因为没有“正确”答案,但我认为最好的答案就是最有帮助的答案。

非常感谢您的帮助!

【问题讨论】:

    标签: javascript node.js web-applications database-design architecture


    【解决方案1】:

    如果我正在构建它,我会使用 Backbone.js,并使用一个简单的 RESTful CRUD 接口(Backbone 的默认同步方法是为它构建的),但这只是我。

    通过这种方法,您可以拥有一个任务模型,将其扩展到子任务模型(添加父属性),并让每个任务(以及子任务)拥有一组子任务。

    同步很简单,因为您可以使用 Backbones 构建同步方法和一个基本的 RESTful CRUD 服务器。

    您可以在 Backbone 模型中包含您想要的任何验证,并通过侦听该集合上的自定义事件(当该集合状态中的模型更改时触发)绑定到任务子任务以确定任务(以及所有子任务)已完成。

    我知道这篇文章对 Backbone 的评价很高,但这是一个主观问题,这是我的看法。

    服务器端我建议使用 Express,您可以使用 express-resources 模块来简化您的 REST 实现。

    再说一次,这只是我的看法。随时提问。

    【讨论】:

    • 非常感谢,尼克!这正是我所希望的答案类型。不过,我将把这个问题留着,看看我是否也能得到其他人的方法。
    • 我确实有几个问题。 1) 这个项目是 Backbone.js 的一个非常典型的用例吗?也就是说,如果我研究 Backbone.js 并深入研究标准示例项目的机制,我应该开始了解我的应用程序应该如何构建吗?或者,会有一些警告吗? 2) 数据实际上是如何在服务器和浏览器之间流动的?我是否创建了一个 RESTful CRUD 服务器,然后客户端应用程序只从服务器请求所有数据来填写列表?那么,当用户更新列表项时,我只是请求更新单个记录? 3) 你有什么数据库推荐吗?
    • 我将从查看基本的 Backbone Todo 应用程序开始。您可以查看应用程序本身 (backbonejs.org/examples/todos),并在 backbonejs.org/docs/todos.html 处查看带注释的源代码。我想你会开始看到 Backbone 将如何融入你的应用程序。可能会有一些警告(例如管理子集合),但是谷歌搜索应该为其中的大多数提供解决方案(有些甚至链接到来自主干文档)
    • 2) 默认情况下,Backbone 使用 RESTful 模式,并且会在您对模型进行更改时发出适当的请求(通过阅读文档可以清楚地了解这一点)。如果您真的对此感兴趣,可以对其他模式(例如 websockets)进行修改。 3) 我会使用 MySQL 作为数据库,但如果您愿意,也可以使用 NoSQL 选项(例如 Mongo)。您的主干应用程序只会通过您的 HTTP(或 websocket)端点与之交互,因此只要您的接口与您的数据库正常通信就没有关系。
    • 再次感谢尼克。这是一个有益的开始。由于这个问题已经结束(哦,好吧......),我会继续接受你的回答。感谢您的帮助!
    猜你喜欢
    • 2011-06-10
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多