Счастливых выходных все,
Я работаю над задачей, которая извлекает данные из API, затем сохраняет их в файле csv, а затем непосредственно загружает их в корзину AWS S3.Я пробовал несколько способов, но в настоящее время я застрял в самом последнем пункте.Любая помощь будет очень полезна
Мой код ниже продемонстрирует большинство проблем, а также то, что я пытался до сих пор.
- Сначала я получу данные изAPI
async systems() {
const endpoint = sampleEndPoints.SYSTEMS
return this.aggregateEndpoint(endpoint)
}
- Во-вторых, я получу данные, которые были извлечены обратно, и помещу их в файл csv в качестве буфера.(Потому что я должен хранить их в
fs.createReadStream
позже)
// generate JSON to Buffer
async generateCsvToBuffer(json){
const {aws} = this.config
var ws = xlsx.utils.json_to_sheet(json)
var wb = xlsx.utils.book_new();
await xlsx.utils.book_append_sheet(wb, ws, 'Systems')
const csvParsed = xlsx.write(wb, { type: 'buffer'})
return csvParsed;
}
- В-третьих, я получаю
buffer data
из этого csvParsed
, чтобы upload
егоАмазонка AWS S3.Проблема в том, что Body: fileStream.path
должен показывать содержимое файла, но, к сожалению, он выходит из системы следующим образом: fs.createReadStream
'{"type":"Buffer","data":[80,75,3,4,10,0,0,0,0,0,249,117,199,78,214,146,124
async uploadSample(file){
const {aws} = this.config
AWS.config.update({
secretAccessKey: aws.secretAccessKey,
accessKeyId: aws.accessKeyId,
region: 'us-east-2'
})
const bufferObject = new Buffer.from(JSON.stringify(file))
/*** WE NEED THE FILE SYSTEM IN ORDER TO STORE */
const fileStream = fs.createReadStream(bufferObject)
const uploadParams = {Bucket: aws.bucket, Key: aws.key, Body: fileStream.path}
const s3 = new AWS.S3()
await s3.upload(uploadParams,null,function(error, file){
if(error){
console.log(error)
} else {
console.log('Successfully uploaded')
}
})
}
- Все мои функции будут выполнены в
server.js
.Так что если вы посмотрите на это, то вы можете получить полную картину проблемы
app.get('/systems/parsed', async(req, res) => {
const Sample = await Sample()
//Fetch the data from an API
const systems = await Cache.remember('systems', async() => {
return Sample.systems()
})
const integration = await IntegrationInstance()
/** GET THE RESPONSE DATA AND PUT THEM IN A CSV FILE*/
const result = await integration.generateCsvToBuffer(systems)
const aws = await AwsInstance()
/*** GET THE SYSTEMS FILE (CSV FILE) THEN UPLOAD THEM INTO THE AWS S3 BUCKET*/
const awsUpload = await aws.uploadWorkedWithBuffer(result)
return res.send(awsUpload);
})
Моя единственная проблема в том, что файл имеетуспешно загружен в Amazon AWS S3, но содержимое файла все еще находится в буфере.Любая помощь по существующей функции / любой более короткий путь был бы очень признателен.
Вот мое резюме еще раз: получить данные с сервера -> поместить файл Csv в качестве буфера, НО извеб-браузер -> и оттуда загрузите его в корзину Amazon AWS S3 -> Проблема в том, что файл загружен, но содержимое файла все еще находится в буфере.