#sequelize.js
#sequelize.js
Вопрос:
Я хочу передавать запросы с одного сервера на другой через http. Так, например, следующий запрос мне нужно сериализовать и де-сериализовать.
const query = { where: {value: { [Op.like]: `%${search}%` } }};
наш JSON.stringify(query)
вариант будет:
{"where":{"value":{}}}
Что неверно, как это возможно?
Спасибо
Комментарии:
1. Вы не можете его stringify из-за
[Op.like]
. Вы могли бы просто сгенерировать SQL и отправить его, но это, вероятно, небезопасно, поэтому не должно быть общедоступным. Или просто отправьте аргумент и восстановите запрос на сервере запросов.2. Попробуйте использовать операторы на основе строк в качестве ключей на первом сервере и отправьте действительный строковый объект на сервер, который должен выполнить sql, и там используйте
reduce
метод для ключей объекта запроса, чтобы заменить операторы на основе строк на основе действительных символов sequelize. Не используйте операторы на основе строк непосредственно в запросе sequelize, поскольку они устарели
Ответ №1:
Тип символа Javascript по умолчанию не сериализуем (исходный код). Существует ряд причин, по которым это менее оптимальный подход:
- Это не лучший шаблон для построения запросов вне службы, которая их запускает — вы не только сталкиваетесь с этой проблемой (в частности, с Sequelize ), но и открываете себя для векторов атак, если позволяете своей службе запускать код из внешнего источника.
- Вы привязываете вызывающего абонента к конкретной логике и формату вашего сервиса, поэтому вам будет сложнее рефакторинг вашего кода, если вам нужно.
- Вы излишне увеличиваете размер полезной нагрузки. В вашем случае это может не быть проблемой, но если вы кодируете для высокой пропускной способности, это может действительно истощить ваши ресурсы без ощутимой выгоды.
Лучший подход — передать части вашего запроса, которые, как вы знаете, изменятся в сериализованном сообщении, а затем создать запрос на принимающей стороне; таким образом, вы можете использовать символы, поскольку вам не нужно их сериализовать, вы уменьшаете пространство для атак для злоумышленников, вы уменьшаете нагрузку на сеть, и вы инкапсулируете больше своих внутренних операций, так что, если вам нужно внести коррективы, вызывающий не всегда должен знать о них. В этом случае вы просто передадите
{
"search": <search_term>
}
И затем в вашем сервисе вы создадите запрос:
const query = { where: {value: { [Op.like]: `%${parameters.search}%` } }};