关于使用NodeJS UI服务器分离前端和后端的问题

时间:2014-05-26 13:58:00

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

在过去几个月中,我们一直在寻找以下问题的解决方案:前端开发人员无需后端开发人员的帮助即可轻松修改网站外观。

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

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

问题是,我们坚信这种分离对于建筑POV是一件好事,但我们担心这些缺点。我们怀疑它会让事情变得更难。我们团队中没有一个人从未使用过这种架构,所以任何提示或经验都非常有价值。

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

1 个答案:

答案 0 :(得分:4)

您需要做的是使用清晰的线条将前端与后端分开。然后,无论后端团队的前端需求如何,都会全面记录下来。

让我们说你现在拥有的是这样的:

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,即Models。您可以将其一直继续到左侧的数据库。

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

如果您的团队规模很大,拥有庞大的代码库,请确保始终在接口中保持向后兼容性,但在日志中添加了已弃用的警告。永远不要试图破坏任何东西。