2015-12-10 2 views
1

У меня есть интерфейс запросов для MongoDB и отправляю запросы от браузера к NodeJS через HTTP-запрос. Запрос посылается в виде строки и может быть что-то вроде этого:Eval MongoDB Query with NodeJS

var query = '{_id: ObjectId(\'536b07935c89be214c000009\'), "date": ISODate("2012-12-19T06:01:17.171Z"), mail: /test/i}' 

Мой вопрос, как я могу смело оценить эту строку для того, чтобы отправить его клиенту MongoDB NodeJS?

eval не является вариантом (как на MongoDB, так и на NodeJS), поскольку это часть приложения, ориентированного на потребителя.

Я открыт для других безопасных решений для передачи запроса через HTTP и правильно выполнять их на сервере.

+0

Каково значение 'query' в вашем коде? Это просто строка, содержащая значение, которое вы вставили выше? Как именно ваш код выходит из строя? Что такое сообщение об ошибке? Вам нужно предоставить дополнительную информацию, чтобы люди могли вам помочь. –

+0

@mbaird Исправлено, не нужно показывать код, который я пытался с его сбоем, и что я не привязан к этому решению – arkihillel

+0

Используете ли вы какой-либо конкретный API MongoDB для узла, или вам все равно, какой из них использовать? –

ответ

0

Строка, которую вы представляете, представляет собой запрос оболочки mongodb. Эта строка содержит специальные типы данных оболочки mongodb и, как таковая, используется только внутри оболочки mongodb. Вы не можете анализировать или оценивать эти запросы в другой среде (javascript), потому что они недействительны JSON. Следовательно, eval, или JSON.parse, даже не работал бы из-за конкретных типов данных.

Если вы хотите сериализовать запросы mongodb для использования в разных средах, вы можете использовать MongoDB Extended JSON.

https://docs.mongodb.org/v3.0/reference/mongodb-extended-json/

Это стандартный JSON, который может содержать MongoDB типов данных. Ваш запрос понравится в MongoDB extended JSON.

{ 
    "_id": { 
     "$oid": "536b07935c89be214c000009" 
    }, 
    "date": { 
     "$date": "2012-12-19T06:01:17.171Z" 
    }, 
    "mail": { 
     "$regex": "test", 
     "$options": "i" 
    } 
} 

Если вы хотите, чтобы разобрать или оценить строку, как это передать его с собой на Node.js MongoDB водителя, вам нужно будет использовать библиотеку для десериализации это надлежащего Node.js MongoDB объекта драйвера.

Вы можете использовать эту библиотеку, чтобы сделать это:
https://www.npmjs.com/package/mongodb-extended-json

Вы также можете использовать эту библиотеку в вашем браузере, чтобы построить запросы. Или вы можете создавать запросы mongodb вручную.

Я не знаю о пакете plugin/npm, который позволит вам автоматически конвертировать запросы оболочки mongodb в MongoDB Extended JSON автоматически. Вы можете попытаться преобразовать их автоматически, реализовав некоторые из ваших типов (ISODate, ObjectId). Однако у вас никогда не будет полной совместимости между оболочкой mongodb и драйвером mongodb nodejs, многие методы имеют разные подписи и типы возврата, курсоры работают по-другому и т. Д.

Существует также этот проект, альтернативный официально поддерживаемый драйвер mongodb nodejs, который пытается имитировать оболочку немного больше, если вы действительно это цените, но это не поможет вам с вашим конкретным запросом, вам все равно придется его преобразовать.
https://docs.mongodb.org/ecosystem/drivers/node-js/

+0

Как преобразовать стандартную строку запроса MongoDB в расширенный JSON? Можете ли вы написать пример, пожалуйста? Спасибо в любом случае – arkihillel

+0

@arkihillel Я обновил свой ответ, чтобы ответить на ваш комментарий, дайте мне знать, если у вас есть еще вопросы. (пожалуйста, примите также ответ, если вы довольны этим, чтобы я мог получить награду: D) –

+0

@ willem-dhaeseleer Ну, я думаю, я должен был быть более конкретным в моем вопросе. Я хочу, чтобы пользователи подключались к их БД, пишут обычные запросы оболочки mongodb. Затем передать их (или эквивалент, как в расширенном JSON) через HTTP-запрос и выполнить их на сервере. Ваше решение заставляет пользователей писать запросы в расширенном режиме JSON. Я вполне могу это принять, если то, что я хочу сделать, технически невозможно – arkihillel