Я думаю, что, возможно, структура кода - то, что делает это немного запутанным для отладки. Я переформатировал вещи для этого примера, но не обязательно решать проблему, с которой вы столкнулись.
Есть две проблемы, которые, я думаю, могут быть причиной проблем с этим.
Во-первых, мы получаем массив массивов объектов, когда нам на самом деле нужен массив объектов. Это достаточно легко решить, если вы сгладить массив, как показано в функции ниже.
Во-вторых, мы записываем необработанный объект в файл. Насколько я понимаю, и после некоторого тестирования, которое я провел, fs
запишет данные, которые вы передаете, в файл в виде строки. Это означает, что он будет использовать довольно упрощенное преобразование, и ваши объекты будут выглядеть как [Object object]
, как вы видели. Чтобы обойти это, мы можем использовать JSON.stringify
, чтобы получить более подходящее преобразование. Я смоделировал вызовы fs
и api, но пример дает вам приблизительное представление.
Я также преобразовал это, чтобы использовать map
и Promise.all
вместо передачи в массив из цикла. Я чувствую, что это немного легче понять таким образом, если это не имеет смысла, пожалуйста, не стесняйтесь комментировать, и я углублюсь в подробности.
const api = {
get: data => new Promise(res => {
setTimeout(() => res([data]), 1000)
})
}
const fs = {
writeFileSync: (location, data) => {
console.log(
`writing data ${data} to ${location}`
);
console.log('=====================');
}
}
const data = [
{A: 'test', B: 'another test'},
{A: 'test2', B: 'another test2'},
];
const makeApiCallFromDataItem = dataItem => api.get({
origin: dataItem.A,
destination: dataItem.B,
});
const callApiForAllDataItems = data => Promise
.all(data.map(makeApiCallFromDataItem))
const flatten = dataIn => dataIn.reduce((prev, curr) => [
...prev,
...curr
])
callApiForAllDataItems(data)
.then(data => {
fs.writeFileSync('api/data/destinations3.json', data)
})
callApiForAllDataItems(data)
.then(data => {
fs.writeFileSync('api/data/destinations3.json', JSON.stringify(data))
})
callApiForAllDataItems(data)
.then(data => {
const flatData = flatten(data);
fs.writeFileSync('api/data/destinations3.json', JSON.stringify(flatData))
})