Загрузка изображения в корзину s3 из node.js

#node.js #amazon-s3

#node.js #amazon-s3

Вопрос:

node.js код ниже

общедоступная ссылка на корзину, которую вы можете просмотреть в
созданной корзине в регионе ‘ap-south-1’ :- https://iamgroot007.s3.ap-south-1.amazonaws.com/deadpool.png

 const AWS = require("aws-sdk");
const fs = require("fs");
const BUCKET = process.env.BUCKET;
const REGION = process.env.REGION;
const ACCESS_KEY = process.env.ACCESS_KEY_ID;
const SECRET_KEY = process.env.SECRET_ACCESS_KEY;
const localImage = "./ap.png";
const imageRemoteName = `catImage_${new Date().getTime()}.png`;

router.post("/image-upload", (req, res) => {
  AWS.config.update({
    accessKeyId: ACCESS_KEY,
    secretAccessKey: SECRET_KEY,
    region: REGION,
  });

  const s3 = new AWS.S3();

  s3.putObject({
    Bucket: BUCKET,
    Body: fs.readFileSync(localImage),
    Key: imageRemoteName,
  })
    .promise()
    .then((response) => {
      console.log(`done! - `, response);
      console.log(
        `The URL is ${s3.getSignedUrl("getObject", {
          Bucket: BUCKET,
          Key: imageRemoteName,
        })}`
      );
    })
    .catch((err) => {
      console.log("failed:", err);
    });
  

Получение ошибки :-

сообщение: ‘Недоступный хост: s3.ap-south-1'. This service may not be available in the ap-south-1, ‘ регион.’, код: ‘Неизвестная конечная точка’, регион: ‘ap-south-1,’, имя хоста: ‘s3.ap-south-1’, повторяемая попытка: true, originalError: { Ошибка: getaddrinfo НЕ НАЙДЕНО s3.ap-south-1, s3.ap-south-1:443 в GetAddrInfoReqWrap.onlookup [как завершенное ] (dns.js: 56:26) сообщение: ‘getaddrinfo ENOTFOUND s3.ap-south-1, s3.ap-south-1:443’, ошибка: ‘ENOTFOUND’, код: ‘NetworkingError’, системный вызов: ‘getaddrinfo’, имя хоста: ‘s3.ap-south-1’, хост: ‘s3.ap-south-1’, порт: 443, регион: ‘ap-south-1,’, повторяемая попытка: true, время: 2020-09 -11T19:08:30.062Z }, время: 2020-09-11T19:08:30.062Z }

Комментарии:

1. Имеет ли имя хоста в сообщении об ошибке (`s3.ap-south-1 `) буквально эту косую черту в конце или это какая-то ошибка копирования / вставки с вашей стороны? Подтвердили ли вы путем регистрации, что значения переменной среды вашего корзины и региона действительно верны?

2. Да, моя корзина и название региона указаны правильно, и ошибка была вставлена как есть

3. Способ инициализации, не связанный с вашей проблемой подключения, является неправильным imageRemoteName . Вы должны переместить его в обработчик функции. Как вы написали, несколько загрузок могут быть записаны в один и тот же файл cat, если при вызове лямбда-функция не запускается (в этом случае код инициализации вне обработчика функции не запускается повторно).

4. Спасибо за предложение. Я обновлю, как вы сказали

5. На самом деле, возможно, это даже не выполняется на Lambda, но остается комментарий, который вы должны инициализировать imageRemoteName в обработчике маршрута загрузки. Можете ли вы запустить awscli в той же системе? Возможно, протестируйте awscli, загружающий объект в ту же корзину ap-south-1, используя те же переменные среды BUCKET и REGION в командной строке.

Ответ №1:

Было 2 ошибки 1> В папке .env, которая у меня была ‘,’ после секретного ключа, ключа доступа и имени корзины 2> я не использовал промежуточное программное обеспечение multer для приема входящих FormData

Рабочий код для загрузки изображения:-

 const s3 = new AWS.S3({
  accessKeyId: ACCESS_KEY,
  secretAccessKey: SECRET_KEY,
});

const storage = multer.memoryStorage({
  destination: function (req, file, callback) {
    callback(null, "");
  },
});

const upload = multer({ storage }).single("image");

router.post("/image-upload", upload, (req, res) => {
  let fileName = req.file.originalname.split(".");
  const myFileType = fileName[fileName.length - 1];
  const Key = `shopLogo/${uuidv4()}.${myFileType}`;
  console.log(fileName, myFileType, Key, BUCKET);
  const params = {
    Bucket: BUCKET,
    Key,
    Body: req.file.buffer,
  };

  s3.upload(params, (err, data) => {
    if (err) {
      res.status(500).send(err);
    }
    res.status(200).send(data);
  });
});