Как я могу получить доступ к методам внутри класса снаружи класса - PullRequest
1 голос
/ 29 мая 2019

У меня есть пара вопросов относительно файлов классов.У меня нижеуказанный класс

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.

И каковы ограничения метода?Может ли он быть простым или асинхронным и использовать обещания и т. Д.?

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

Есть две основные вещи, которые следует учитывать при решении следующей проблемы.

  1. Сначала экспортируйте его правильно.Я не уверен, что вы хотели это исключить, но важно экспортировать класс для использования снаружи как require.Вот NodeJS экспортная документация , если вы хотите технические детали.
// 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);
0 голосов
/ 30 мая 2019

Я понял это через некоторое время назад, часть моей проблемы заключалась в том, что по какой-то причине визуальный студийный код не показал мне метод, который отбросил меня. Ручная печать сделала его в конечном итоге полезным.

Вот мой класс, и я фактически переместил конфиг и сам couchbase в файл класса, так что больше не нужно его передавать.

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)
}
0 голосов
/ 29 мая 2019

Вам нужно создать экземпляр класса после его импорта

Изменить следующее

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(...)

...