Прежде всего, то, что вы пытаетесь сделать, довольно опасно; предоставляя пользователю возможность выполнить произвольный запрос к базе данных из внешнего интерфейса вашего приложения. Я советую осторожно.
Во-вторых, ошибка говорит само за себя - вы не можете вызвать метод each()
для undefined
. Что такое undefined
тогда? Видите, когда ваш запрос выглядит следующим образом: devices.orderBy('name')
, код выполняет следующее:
let mangoArray=torun.split('.') // ["devices", "orderBy('name')"]
...
}else if(mangoArray.length== '2'){
db[mangoArray[0]][mongoArray[1]]
// ^ now pay attention: db["devices"]["orderBy('name')"]
.each(item=>{
console.log(item);
});
Итак, хотя объект db
имеет поле атрибута devices
, он определенно не имеет orderBy('name')
. Если вы хотите вызвать метод этого объекта, есть несколько способов справиться с этим. Самый простой (но самый опасный ) - пропустить разделение и обработать его с помощью eval
:
const query = eval(`db.${torun}`)
query.each(...)
Но это позволяет пользователю делать с вашими данными все, что он хочет - удалить, изменить, испортить и т. д. c. Более безопасный способ - использовать довольно сложную проверку регулярных выражений на входе.
Самым безопасным и наиболее рекомендуемым является создание удобного интерфейса, позволяющего пользователю получить доступ к вашим данным с полным контроль. Создайте несколько форм, которые позволяют пользователю выбирать, какие данные он хочет получить, как их упорядочить, фильтровать, затем отправлять эти данные через сервер и возвращать адекватный ответ. Это называется «скрытой реализацией» - пользователю вашего приложения не нужно знать, какую базу данных вы используете, не говоря уже об API этой базы данных!
Надеюсь, это поможет.