如何从类外部访问类内部的方法

时间:2019-05-29 16:38:55

标签: javascript node.js couchbase

关于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等?

3 个答案:

答案 0 :(得分:2)

关于以下问题,您应该考虑两个主要问题。

  1. 先正确导出。我不确定您是否要忽略此内容,但是将类导出为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)
              )     
            });
          }
  }
  1. 类初始化有点不正确。您可以在此here上查看文档。您可以将需求和初始化更改为...
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)
}