Доступ к статическому методу nodejs с использованием строковой переменной - PullRequest
0 голосов
/ 22 марта 2019

Я импортировал несколько классов в Adonis

const User = use('App/Models/User')
const Orders = use('App/Models/Orders')

Я хочу иметь возможность динамического доступа к одному из вышеуказанных классов.Я имею в виду, что переменная будет содержать класс, к которому я хочу получить доступ.Переменная будет заполнена с помощью вызова API от пользователя.

let className = 'Orders'

Как использовать переменную className для доступа к классу Orders.

Я пробовал

[className].query().where('orderNumber','123').fetch()

Однако это не похоже на работу.

Ответы [ 3 ]

4 голосов
/ 22 марта 2019

Создание карты name -> class:

const classes = {
  __proto__: null, // to avoid people being able to pass something like `toString`
  Users,
  Orders,
};
// or if you don't want to use __proto__
const classes = Object.assign(
  Object.create(null),
  {Users, Orders}
);

и получите доступ к нужному классу с помощью classes[className]. Конечно, проверьте, существует ли класс.


Я пытался

[className].query().where('orderNumber','123').fetch()

Однако это не похоже на работу.

В этом контексте [...] обозначает литерал массива, поэтому [className] просто создает массив, содержащий className (который является строкой в ​​вашем примере) в качестве единственного элемента.

0 голосов
/ 22 марта 2019

Проще всего было бы eval(className).query().where('orderNumber','123').fetch(), но если вы хотите проверить существование значений как фактический класс, вам, вероятно, следует реализовать переключатель или if-else-if, чтобы проверить и назначить className и вызывать, только если он действительно присутствует.

0 голосов
/ 22 марта 2019

Избегайте преобразования переменной в строку вообще. Просто используйте:

let className = Orders;
className.query().where('orderNumber','123').fetch()

Если экземпляр класса создается с помощью вызова API, используйте простой оператор switch:

let class;
switch (apiCall.name) {
    case 'orders':
        class = Orders;
        break;
    case 'users':
        class = Users;
        break;
    default:
        throw 'Invalid API Call';
}

class.query().where('orderNumber','123').fetch()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...