sequelize — передача запроса через http (сериализация / stringify)

#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}%` } }};