Как передать несколько значений в опциях экспресс-узла qs? - PullRequest
1 голос
/ 13 марта 2019

В моем файле node.js я пытаюсь передать несколько значений в поля tracking и carrier, но у меня ничего не получилось.Я могу сделать это с отдельными значениями (1 номер отслеживания для tracking и 1 код оператора для carrier), но не для нескольких значений.Я чувствую, что должна быть вовлечена петля, но, возможно, я ошибаюсь, утверждая это.Любая помощь будет принята с благодарностью.

Index.html

<script>

    function UserParams() {
        console.log('UserParams')

        var trackingNumber = ['123', '456'];
        var carrierCode = ['usps', 'fedex'];

        var url = '/api/tracking/retrieve/';

        $.ajax({
            type: 'GET',
            url: url,
            data: { tracking: trackingNumber, carrier: carrierCode },
            dataType: 'json',
            error: function (e) {
                console.log('Error Message: ', e.message);
            }
        });

    }

</script>

Controller.js

    app.get("/api/tracking/retrieve", (req, res) => {

    var carrier = req.query.carrier;
    var tracking = req.query.tracking;

    console.log('carrier array', carrier);
    console.log('tracking array', tracking);

    var options = {
        method: "GET",
        url: 'https://api.example.com/v1/tracking',
        qs: { carrier_code: carrier, tracking_number: tracking },
        headers:
            {
                'api-key': process.env.SECRET_KEY_SE,
                'accept': 'application/json'
            }
    }

    console.log("Url: ", req.url);
    console.log("Query: ", req.query);
    res.send("ok");

    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log('BODY', body)
            var trackingData = JSON.parse(body)
            table = 'tracking_table';
            col = [
                'user_id',
                'tracking_number',
                'carrier_code',
                 ];
            val = [
                user_id,
                trackingData.tracking_number,
                options.qs.carrier_code,
                   ];
            main.create(table, col, val, function (data) {
                res.json({
                    id: data.insertId,
                    user_id: user_id,
                    tracking_number: data.tracking_number,
                    carrier_code: data.carrier_code,
              });
            })
        }
    })

})

Результатв терминале:

carrier array [ 'usps', 'fedex' ]
tracking array [ '123', '456' ]
Url:  /api/tracking/retrieve/?tracking%5B%5D=123&tracking%5B%5D=456&carrier%5B%5D=usps&carrier%5B%5D=fedex
Query:  { tracking: [ '123', '456' ],
carrier: [ 'usps', 'fedex' ] }

Редактировать: отредактированный вопрос для включения дополнительного контекста.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Попробуйте изменить отслеживание строки и оператор на массив с функцией split

app.get('/api/tracking/retrieve', function (req, res) {
  options = {
      method: "GET",
      url: 'https://api.example.com/v1/tracking',
      qs: { tracking_number: tracking.split(','), carrier_code: carrier.split(',') },
      headers:
          {
              'api-key': process.env.SECRET_KEY_SE,
              'accept': 'application/json'
          }
  }

  request(options, function (error, response, body) {
 })
});
0 голосов
/ 13 марта 2019

В зависимости от того, что такое бэкэнд, вы можете просто использовать для этой цели массивы, например,

var tracking = ['9361289691090998780245','784644233438'];
var carrier =  ['usps','fedex'];

options = {
    method: "GET",
    url: 'https://api.example.com/v1/tracking',
    qs: { tracking_number: tracking, carrier_code: carrier },
    headers:
        {
            'api-key': process.env.SECRET_KEY_SE,
            'accept': 'application/json'
        }
}

request(options, function (error, response, body) {
    if (error) console.error("An error occurred: ", error);
    console.log("body: ", body);
});

Если это обслуживается Express, строка запроса будет проанализирована правильно, например,

app.get("/api/tracking/retrieve", (req, res) => {
    console.log("Url: ", req.url);
    console.log("Query: ", req.query);
    res.send("ok");
});

Это то, что было бы зарегистрировано Express;

Url:  /api/tracking/retrieve?tracking_number%5B0%5D=9361289691090998780245&tracking_number%5B1%5D=784644233438&carrier_code%5B0%5D=usps&carrier_code%5B1%5D=fedex
Query:  { tracking_number: [ '9361289691090998780245', '784644233438' ], carrier_code: [ 'usps', 'fedex' ] }

Конечно, это зависит от провайдера API, поэтому, возможно, стоит посмотреть, есть ли у них документация по форматированию параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...