Как записать в существующий файл в корзине S3 на основе предварительно подписанного URL? - PullRequest
0 голосов
/ 01 июля 2019

Я искал способ записи в файл JSON в сегменте S3 с предварительно подписанного URL-адреса.Из моего исследования видно, что это можно сделать, но это не в Node:

Не могу найти решение Node из моих поисков и использоватьAPI стороннего производителя Я пытаюсь записать обратный вызов в JSON, который находится в корзине S3.Я могу создать предварительно подписанный URL без проблем, но когда я пытаюсь записать фиктивный текст в предварительно подписанный URL, я получаю:

Ошибка: ENOENT: нет такого файла или каталога, откройте 'https://path -to-file-with-sign-url '

Когда я пытаюсь использовать writeFile:

fs.writeFile(testURL, `This is a write test: ${Date.now()}`, function(err) {
  if(err) return err
  console.log("File written to")
})

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

После реализации node-fetch я все еще получаю ошибку (403 Forbidden) при записи в файл в S3 на основе предварительно подписанного URL, вот полный код из написанного мной модуля:

const aws = require('aws-sdk')
const config = require('../config.json')
const fetch = require('node-fetch')
const expireStamp = 604800 // 7 days

const existsModule = require('./existsModule')

module.exports = async function(toSignFile) {
  let checkJSON = await existsModule(`${toSignFile}.json`)
  if (checkJSON == true) {
    let testURL = await s3signing(`${toSignFile}.json`)
    fetch(testURL, {
      method: 'PUT',
      body: JSON.stringify(`This is a write test: ${Date.now()}`),
    }).then((res) => {
      console.log(res)
    }).catch((err) => {
      console.log(`Fetch issue: ${err}`)
    })
  }
}

async function s3signing(signFile) {
  const s3 = new aws.S3()
  aws.config.update({
    accessKeyId: config.aws.accessKey,
    secretAccessKey: config.aws.secretKey,
    region: config.aws.region,
  })
  params = {
    Bucket: config.aws.bucket,
    Key: signFile,
    Expires: expireStamp
  }
  try {
    // let signedURL = await s3.getSignedUrl('getObject', params)
    let signedURL = await s3.getSignedUrl('putObject', params)
    console.log('\x1b[36m%s\x1b[0m', `Signed URL: ${signedURL}`)
    return signedURL
  } catch (err) {
    return err
  }
}

Просмотр разрешений У меня нет проблем с загрузкой и доступом для записи, установленной в разрешениях.В Узле, как я могу записать файл в корзину S3, используя предварительно подписанный URL этого файла в качестве пути?

1 Ответ

1 голос
/ 01 июля 2019

fs - это модуль файловая система . Вы не можете использовать его как клиент HTTP.

Вы можете использовать встроенный модуль https, но я думаю, вам будет проще использовать node-fetch .

fetch('your signed URL here', {
  method: 'PUT',
  body: JSON.stringify(data),
  // more options and request headers and such here
}).then((res) => {
  // do something
}).catch((e) => {
  // do something else
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...