Sails.js : Как получить доступ к req.params и изменить его в промежуточном программном обеспечении

#express #sails.js

#экспресс #sails.js

Вопрос:

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

Мне пришло в голову написать промежуточное программное обеспечение для перехвата каждого объекта запроса и ответа и проверки наличия id поля. Если запрос содержит id поле, и это запутанная версия, расшифруйте строку и замените параметр запроса целочисленным идентификатором.

Если ответ содержит целочисленный идентификатор, запустите для него функцию encode, чтобы отправить клиенту запутанный идентификатор.

Проблема, с которой я сталкиваюсь, связана с изменением req объекта. id Поле может присутствовать в req.body или req.params или res.query . Однако в промежуточном программном обеспечении я не вижу поле id, когда оно присутствует req.params .

Я пытался использовать политики. Но проблема, с которой я сталкиваюсь, заключается в том, что даже после изменения req.params изменения теряются, когда элемент управления достигает контроллера. Каков рекомендуемый способ решения этой проблемы?

Вот пример кода:

В политике:

 module.exports = function (req, res, next) {
  req.params.id = '12345';
  req.query.pageSize = 30;
  req.body = {};

  sails.log.info('req.params', req.params);
  sails.log.info('req.query', req.query);
  sails.log.info('req.body', req.body);
  return next();
};
  

Я просто изменяю значения req.params, req.запрос и req.body.

Когда я пытаюсь получить доступ к этим значениям в контроллере, значения req.запрос и req.body — это измененные значения, измененные в политике. Однако req.params возвращается к тому, что было отправлено клиентом, и изменения, внесенные в политику, теряются

Комментарии:

1. какой-нибудь код, пожалуйста?

2. @SkyQ: добавлен некоторый пример кода. Я сейчас мало что делаю. Просто измените значения req.params, req. запрос и req.body

Ответ №1:

Я думаю, вы путаете политику и промежуточное программное обеспечение? Указан ли ваш код выше в api / policies? Если это так, вам все равно нужно определить, к каким контроллерам применяется эта политика в config / policies .

Итак config/policies.js должно выглядеть так:

 modue.exports.policies = {
    // If you really want this policy for every controller and action
    '*': 'policyName.js',

    // If you want it for a specific controller. '*' denotes every action in controller
    specificController: {
        '*': 'policyName.js'
    },

    // If you want it for a specific action on a specific controller
    specificController: {
        'specificAction': 'policyName.js'
    }

};
  

Также я хотел бы добавить. Политики обычно предназначены для авторизации контроллеров, но это кажется достойным вариантом использования. Поскольку в каждом отдельном запросе не будет этих полей, это должно быть политикой. Политики хороши при применении чего-либо к нескольким контроллерам / действиям. Промежуточное программное обеспечение отлично подходит, когда вам нужно применять к каждому отдельному действию, которое входит в ваше приложение.

http://sailsjs.org/documentation/concepts/policies

http://sailsjs.org/documentation/concepts/middleware

Ответ Gitter: sgress454 @sgress454 10:45 @mandeepm91

В политике, если я изменю req.body или req.запрос, изменения сохраняются в следующей политике или контроллере. Однако изменения, внесенные в req.params, теряются. Это один из основных вариантов использования req.options. Этот объект предназначен для хранения данных запроса, которые могут быть изменены одним обработчиком перед передачей следующему. Объект req.params предназначен для предоставления каждому обработчику копии исходных параметров запроса. То, как вы подходите к этому, действительно зависит от вашей цели. Если вам действительно нужно, чтобы каждый обработчик запроса (то есть политики и действия контроллера) видел закодированную версию идентификатора, то хорошим подходом было бы закодировать идентификатор в политике, как предложил @S-Stephen, сохранить это значение в req.options.id и ссылайтесь на это в своемдругие обработчики запросов. Если, с другой стороны, вас действительно интересует только ответ с закодированным идентификатором, рекомендуется использовать ответ res.ok() в ваших обработчиках (а не res.send() или res.json) и настроить код для этого ответа в api/responses/ok.js чтобыкодируйте идентификатор перед отправкой. Вы также можете использовать пользовательский ответ, если это требуется только для определенных запросов. Дополнительные сведения см. в разделе Пользовательские ответы. Привет @sadlerw, вы должны иметь возможность изменять код для res.ok() в вашем api/responses/ok.js файл, чтобы он всегда возвращал JSON, если это то, что вы хотите для каждого ответа. Если это то, что вам нужно только для определенных действий, вы можете вместо этого создать пользовательский ответ и использовать его там, где это необходимо.

Комментарии:

1. Я не путаю политики и промежуточное программное обеспечение. Я пробовал оба. В промежуточном программном обеспечении я не мог понять, как получить доступ к req.params, поскольку он не определен. В политиках я смог получить к нему доступ, но изменение было потеряно после выполнения действия контроллера. Я внес необходимые изменения в policies.js чтобы прикрепить политику к действию контроллера

2. Я вижу, у вас есть отличное объяснение по gitter! Я собираюсь обновить свой первоначальный ответ ответом gitter, чтобы помочь людям с той же проблемой в будущем.