关于Class文件,我有几个问题。我有下面的课程
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) {
this.bucket.manager().createPrimaryIndex(function() {
this.bucket.query(
this.N1qlQuery.fromString("SELECT * FROM bucketname WHERE $1 in interests LIMIT 1"),
[queryString],
callback(err, result)
)
});
}
}
我的问题是如何从类文件外部访问doSomeQuery函数?内部没有访问函数的问题,但是我需要能够从外部调用它。 我尝试过这样的事情
const CouchController = require("../controllers/CouchController")(couchbase, config)
let newTest = new CouchController
这样做,newTest永远不会公开doSomeQuery方法。
方法的局限性是什么?只能是简单的还是可以异步使用promises等?
答案 0 :(得分:2)
关于以下问题,您应该考虑两个主要问题。
require
以便在外部使用很重要。如果您希望获得技术详细信息,请查看NodeJS exports documentation。// common module default export
module.exports = 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) {
this.bucket.manager().createPrimaryIndex(function() {
this.bucket.query(
this.N1qlQuery.fromString("SELECT * FROM bucketname WHERE $1 in interests LIMIT 1"),
[queryString],
callback(err, result)
)
});
}
}
const CouchController = require('../controllers/CouchController');
const newTest = new CouchController(couchbase, config);
// now you can access the function :)
newTest.doSomeQuery("query it up", () => {
// here is your callback
})
如果您使用的是ES6模块或打字稿,则可以导出类似...
export default class CouchController {
// ...
}
...并导入类似...
import CouchController from '../controllers/CouchController';
const newTest = new CouchController(couchbase, config);
答案 1 :(得分:0)
您需要在导入后实例化该类
更改以下内容
const CouchController = require("../controllers/CouchController")(couchbase, config)
let newTest = new CouchController
到
const CouchController = require("../controllers/CouchController")
let newTest = new CouchController(couchbase, config)
还需要像这样导出课程
export default class CouchController {
然后访问这样的方法
newTest.doSomeQuery(...)
答案 2 :(得分:0)
我来回摸索了一下,部分问题是由于某种原因,Visual Studio代码没有向我展示使我失望的方法。手动键入使它最终可用。
这是我的班级,我实际上将配置和长沙发本身移到了班级文件中,因此不再需要传递它。
const couchbase = require("couchbase")
const config = require("../config/config")
class CouchController {
constructor() {
// 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 = this.cluster.openBucket(config.bucket);
this.N1qlQuery = couchbase.N1qlQuery;
}
getDoc2(docID){
return new Promise((resolve,reject)=>{
this.bucket.get(docID ,(err, result)=>{
if(err) return reject(err);
return resolve({docID,result});
});
});
}
}
module.exports = CouchController
这是我现在如何调用班级并连接到后端以获取数据的方式。
const CouchController = require("./controllers/CouchController")
let newTest = new CouchController
const test= async()=>{
let { docID, result } = await newTest.getDoc2("grid_info::20b05192-79e9-4e9d-94c9-91a4fc0a2765")
console.log(docID)
console.log(result)
}