【问题标题】:Concerns about separating front-end and back-end with a NodeJS UI server [closed]关于使用 NodeJS UI 服务器分离前端和后端的担忧 [关闭]
【发布时间】:2014-07-15 07:54:18
【问题描述】:

在过去的几个月里,我们在工作中一直在寻找解决以下问题的方法:前端开发者在没有后端开发者的帮助下无法轻易修改网站的外观。

我们作为一个团队的文化主要基于全栈框架,例如 Symfony 2 和 Ruby on Rails。我们使用模板引擎,但模板大多由后端开发人员根据设计师的标记编写。

我们正在考虑采取的步骤是将单体架构分离为后端 rest API 和作为“UI 服务器”的 NodeJS 服务器。 NodeJS 服务器将处理客户端请求,使用后端 API 并返回呈现的模板。通过明确指定 API 和所服务的 JSON,前端和后端开发人员可以并行工作,从而减少问题。更多信息在这里:http://www.nczonline.net/blog/2013/10/07/node-js-and-the-new-web-front-end/

问题是,我们坚信这种分离与架构 POV 相比是一件好事,但我们担心其缺点。我们怀疑这会使事情变得更加困难。我们团队中的任何人都从未使用过这种架构,因此任何有关这方面的提示或经验都将非常有价值。

值得吗?什么时候?为什么?

【问题讨论】:

  • 您是否使用任何 MVVM 框架,例如 angularjs (angularjs.org) 或骨干网? Angularjs 非常适合分离的后端和前端,并且易于学习的框架。它支持前端模板和指令。我建议你看看它。
  • @NikolayLukyanchuk 感谢您的评论。是的,我们考虑了 angular 或 ember.js 之类的选项,但我们最终放弃了客户端应用程序方法。与单页应用程序相比,我们更喜欢多页应用程序,并且还有其他解决方法,例如我们不想处理的谷歌抓取。

标签: node.js frontend backend separation-of-concerns


【解决方案1】:

您需要做的是有一条清晰的界限将您的前端和后端分开。然后后端团队无论前端需要什么,都会全面记录下来。

假设你目前拥有的是这样的:

app.get('/', function (req, res) {
    database.query('select * from user', function (err, result) {
        res.render(result);
    });
});

然后你想把它变成这样:

在 UI 服务器中:

app.get('/', function (req, res) {
    request('apiServer/user', function (err, result) {
        res.render(result);
    });
});

在 API 服务器中:

app.get('/user', function (req, res) {
    database.query('select * from user', function (err, result) {
        res.send(result);
    });
});

这很好。这将前端和后端分开,但不仅在逻辑上,而且在物理上,因为它们位于不同的服务器中。

我相信如果他们在同一台服务器下就可以了。而不是上面的,只是将它们放在不同的文件中:

在 user.js 中:

exports.getAll = function (cb) {
    database.query('select * from user', cb);
};

在 server.js 中:

var user = require('./user');
app.get('/', function (req, res) {
    user.getAll(function (err, result) {
        res.render(result);
    });
});

为什么这比您的解决方案更好?因为它分离了触摸数据库和渲染数据,而且它没有额外的http往返。

按照 MVC 模式,您将类似于 user.js 的文件放在模型目录中,您将类似于 server.js 的文件放在控制器目录中。您确保为前端开发人员记录了两者。

现在,如果您的前端开发人员只是要进行 UI 更改,他们只需接触 HTML 文件。如果他们想添加一个包含数据的部分,他们将阅读后端文档,他们将添加另一个对模型的调用以获取他们在呈现 HTML 的相应控制器中的数据。

只要确保您将所有内容标准化,因此当出现新事物时,您团队中的程序员可以以某种方式预测接口的情况,使用良好的 ORM 来进行数据库调用的繁重工作。如果您不选择使用 ORM,请做好抽象。

所以你的分层应用可以是这样的:

Database --> ORM --> Models --> Controllers --> Views(HTML files)

现在前端开发人员,在上图的右侧工作。如果它被很好地抽象出来,他们只需要知道他们左侧的文档化 API,但他们不需要知道它是如何工作的。任何在控制器上工作的人,只需要知道他们左侧的文档化 API,即模型。您可以一直继续到左侧的数据库。

然后在每一层上,您可以一直进行单元测试和集成测试,以确保接口一致。

如果您的团队很大,并且拥有大量代码库,请确保您始终在界面中保持向后兼容性,但在日志中会针对已弃用的内容发出警告。永远不要试图破坏任何东西。

【讨论】:

  • 所以本质上应该设置您的架构,以便您拥有 2 个不同的“后端”系统。 1. API 服务器,以及 2. 访问 API 服务器然后将数据提供给前端的后端 Web 服务器?那准确吗?您是否有任何指向有关此特定主题的相关文章的链接?搜索这个主题只会给我一堆“如何使用 Node.js 制作 REST API”的结果。
  • 可以说是简化的微服务架构。你可以搜索那个。 Here 你可以找到一些很好的信息,但是架构真的取决于需求和你的团队技能。
猜你喜欢
  • 2013-05-19
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多