允许最终客户端(例如 Web 应用程序)直接访问(读/写)服务器资源是一种不好的做法。
例如:如果你改变你的数据库软件(从 mongodb 到另一个东西)怎么办?此外,通过直接访问这些资源,您将数据的“密钥”提供给任何可以检查您的客户端代码的人(即几乎所有人!),并且没有什么能阻止他们对您的宝贵数据进行不必要的和未经验证的更改。您需要在服务器内部开发一个“层”,它可以访问您的数据并响应客户端请求:该层是一个后端服务器应用程序。
有一些软件(库)可以帮助访问数据库:这些软件不是使用“低级数据库语言”,而是为您抽象和封装(包装)这些调用,并简化您的服务器应用程序的开发。在 MEAN 堆栈(nodejs、express、mongodb)中,您可以使用 monk 作为数据访问库。
您的“应用程序堆栈”(双关语!)的粗略图可能如下:
---------------------------------------------------------------------------------------
| SOFTWARE IN YOUR SERVER | CLIENT APP (WEB BROWSER, MOBILE APP, ETC.) |
| mongodb <-> monk <-> backend server app <-> Javascript, native code, etc. |
---------------------------------------------------------------------------------------
您的客户端应用程序只能使用您的后端服务器应用程序公开的 api(接口)。例如:一个 Ionic 框架应用程序(即 Javascript 代码)可以验证和清理(饱和、转换为 JSON 等)用户数据并将其发送到服务器应用程序(通过对服务器 api 进行 Ajax 调用)。然后,服务器应用程序会响应一些结果数据或状态代码/消息,客户端可以依次处理并显示给最终用户。
cmets 中的tutorial 是一个很好的起点。这些是主要的代码:
-
在服务器应用程序中(Node + Express):
// Initialize database access
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest2');
. . .
// define route (api endpoint) to get data (userlist collection in this case)
router.get('/userlist', function(req, res) {
var db = req.db;
var collection = db.get('userlist');
collection.find({},{},function(e,docs){
res.json(docs);
});
});
-
在客户端应用程序(javascript)中:调用后端 api 方法的函数
// Fill table with data
function populateTable() {
// Empty content string
var tableContent = '';
// jQuery AJAX call for JSON
$.getJSON( '/users/userlist', function( data ) {
// process each item in returned JSON data
$.each(data, function(){
// process each data item...
});
// Inject the whole content string into our existing HTML table
$('#userList table tbody').html(tableContent);
});
};
如您所见,客户端代码通过暴露的 api 端点 /users/userlist 调用(使用 Ajax)Web 服务器:此调用将数据返回给客户端。以同样的方式,您可以编写代码在您的服务器数据上创建其他CRUD operations;显然,一个更好的示例需要一个参数列表:要过滤的数据、要发布的数据等。但这是您的服务器应用程序设计和架构的一部分。
在这个例子中,技术恰好是全javascript:服务器应用程序使用nodejs + express(javascript),客户端代码(web或移动应用程序)也使用javascript;但堆栈可以是合适技术的任意组合:在后端,您可以使用任何服务器框架(php、python、asp.net、ruby on rails 等);这同样适用于客户端:任何可用于集成远程数据消费者的技术都可以用作客户端。