#javascript #node.js #express
#javascript #node.js #выразить
Вопрос:
В моем node.js api Я пытаюсь передать несколько значений в поля 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 amp;amp; 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[]=123amp;tracking[]=456amp;carrier[]=uspsamp;carrier[]=fedex
Query: { tracking: [ '123', '456' ],
carrier: [ 'usps', 'fedex' ] }
Редактировать: Отредактированный вопрос, чтобы включить дополнительный контекст.
Комментарии:
1. Что вы получаете в переменных отслеживания и несущей с несколькими значениями?
2. Основывайтесь на своем коде. ‘9361289691090998780245,784644233438’ — это несколько значений. а ‘9361289691090998780245’ — это единственное значение. Правильно?
3. @ChuongTran Да, это правильно. Я отредактировал свой вопрос для лучшего контекста.
4. @Kishan получите как в том, какой ответ я получаю при запуске кода?
Ответ №1:
В зависимости от того, что такое серверная часть, вы можете попробовать просто использовать массивы для этой цели, например
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[0]=9361289691090998780245amp;tracking_number[1]=784644233438amp;carrier_code[0]=uspsamp;carrier_code[1]=fedex
Query: { tracking_number: [ '9361289691090998780245', '784644233438' ], carrier_code: [ 'usps', 'fedex' ] }
Конечно, это зависит от поставщика API, поэтому, возможно, стоит посмотреть, есть ли у них документация о том, как следует форматировать параметры.
Комментарии:
1. Я попробую это позже, чтобы посмотреть, работает ли это. Похоже, вы убрали переменные, сделав их глобальными. Я отредактировал свой исходный код в вопросе, чтобы предоставить дополнительный контекст. Станет ли отслеживание var отслеживанием var = req. запрос.отслеживание, собираюсь ли я отправлять значения из внешнего интерфейса во внутренний?
2. Да, это правильно. Если вы используете массив для этой цели, то переменная res.query.tracking также должна быть массивом!
3. Я скорректировал код вверху, чтобы отразить код, с которым я работаю. Я могу получить результат, о котором вы говорили, но я столкнулся с другой проблемой. Если я использую 1 номер отслеживания и 1 перевозчика в приведенном выше примере, api вернет желаемый json, но когда я использую 2 номера отслеживания и два кода перевозчика, я не получаю никакой информации из api. Нужен ли мне там цикл?
4. Похоже, для этого вам, вероятно, понадобится цикл.
Ответ №2:
Попробуйте изменить отслеживание строк и несущую на массив с помощью функции 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) {
})
});