我有一个运行MongoDB的Express应用程序.我想从服务器级别分离出我的数据库访问.但是,为了获得数据库调用的结果,我似乎只能执行以下两种操作之一:
将Res作为参数传递
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user',dbApi.getUsers(function (data) { res.send(data); })); ... //db-api.js ... getUsers: function (callback) { MongoClient.connect(url,function (err,db) { if (err) { throw err; } db.collection(collections.Users) .find({}) .toArray(function (error,documents) { db.close(); callback(documents); }); }); } ...
假设db-api.js中的Express req / res范例
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user',dbApi.getUsers); ... //db-api.js ... getUsers: function (req,res) { MongoClient.connect(url,documents) { db.close(); res.send(documents); }); }); } ...
但是,我觉得这两种方法都添加了我希望避免的隐式依赖.我更愿意在server.js中独立调用dbApi,这样它返回一个我可以在返回之前操作的结果集,即:
//server.js ... var dbApi = require('../data/db-api.js'); ... app.get('/api/user',function (req,res) { var result = dbApi.getUsers(); //do stuff with result as necessary res.send(result); }); ... //db-api.js getUsers: function () { MongoClient.connect(url,documents) { db.close(); return documents; }); }); }
但是最后一个似乎并不想工作,因为文档没有返回到服务器级别(结果是未定义的).我知道这是因为我试图同步做一些内在异步的事情.
所以,我想,我正在寻找的是关于应用程序架构的最佳实践的任何建议,因为它涉及分离数据访问层.
解决方法
好吧,你可以使用
promisified version of the mongo client,返回该值的承诺,并使用async / await.例如,参见
this answer.