我想知道最好的方法是在我的情况下重用db连接,它是NodeJs和express中的bedfebase连接。 对于Express部分,我创建了这样的中间件
var couchbase = require('couchbase')
var config = require('../config/config')
module.exports = (req,res,next)=>{
var cluster = new couchbase.Cluster(config.cluster)
cluster.authenticate(config.userid, config.password)
let bucket = cluster.openBucket(config.bucket);
bucket.manager().createPrimaryIndex(function() {});
req.bucket = bucket;
req.N1qlQuery = couchbase.N1qlQuery;
next();
}
自从我告诉它以来,它在Express应用程序中可以正常工作
const dbSessionMiddleware = require('../middleware/couch')
app.use(dbSessionMiddleware)
这使我可以通过req.bucket访问它。我的问题是我的应用程序中有控制器,以防万一可能会调用辅助函数,并且他们可能会调用另一个函数以获取一些数据。我想避免必须继续向下传递5个级别的请求对象才能使用中间件。有没有更好的方法让我可以将连接/存储桶公开给普通功能?
答案 0 :(得分:3)
您是否尝试过将初始化代码从中间件功能中删除? Couchbase Documentation并未显示出它的使用方式。尽管示例在普通Node中。通过将其置于中间件功能中,您将在服务器每次收到请求时重新连接数据库。
我在顶级app.js主体中连接到我的Mongo服务器,这使连接得以持久。然后,我可以在模型和控制器中导入所需的猫鼬参考,以概述如何获取某些数据,然后在相关的路由端点内调用控制器的方法。
编辑后显示了将存储桶分配为控制器类字段的示例
在您的app.js中
const couchbase = require("couchbase");
const config = require("../config/config");
// ...app.js
const CouchController = require("../controllers/CouchController")(couchbase, config);
// app.js...
在您的控制器中
class CouchController {
constructor(couchbase, config) {
// You may either pass couchbase and config as params, or import directly into the controller
this.cluster = new couchbase.Cluster(config.cluster);
this.cluster.authenticate(config.userid, config.password);
this.bucket = cluster.openBucket(config.bucket);
this.N1qlQuery = couchbase.N1qlQuery;
}
doSomeQuery(queryString, callback) {
// Use your query however its meant to be used. I'm not familiar with couchbase queries.
this.bucket.manager().createPrimaryIndex(function() {
this.bucket.query(
this.N1qlQuery.fromString("SELECT * FROM bucketname WHERE $1 in interests LIMIT 1"),
[queryString],
callback(err, result)
)
});
}
}
然后从路由内部调用您的Controller方法
router.get("/", function(req, res, next) {
let searchParam = req.query.someParam;
CouchController.doSomeQuery(searchParam)
.then(result => {
res.json(result);
});
});
答案 1 :(得分:1)
您可以创建一个专用模块(例如db.js
),在其中为连接池实现单例。
// pseudo-code
export const getDb = () => {
let db
if (!db) {
const connection = createConnectionPool()
db = connection.db
}
return db
}
此功能可以导入您的中间件和代码的其他部分。