headObject никогда не выдает ошибку, когда объект не существует - PullRequest
0 голосов
/ 24 апреля 2019

В настоящее время я пытаюсь проверить, существует ли файл, используя aws-sdk для Amazon s3 (точнее, функцию headObject).

Как я мог читать буквально везде, эта функция должначтобы использовать его при попытке проверить, существует ли файл (чтобы затем получить его URL через getSignedUrl), однако я не могу заставить его работать.

Кажется, что независимо от того, что я делаю,Функция s3.headObject сообщает мне, что объект существует.Я попытался проверить существующие, несуществующие элементы и даже несуществующие корзины: все они дали мне точно такой же результат.Я пробовал разные способы вызова функции (асинхронный или нет, используя ее обратный вызов или нет), но без разницы.

Вот как я понимаю свой вызов функции:

var params = {
    Bucket: 'BUCKET NAME',
    Key: ""
}

// Some more code to determine file name, confirmed working

params.Key = 'FILE NAME'
try {
    s3.headObject(params)
    // Using here the file that is supposed to exist
} catch (headErr) {
    console.log("An error happened !")
    console.log(headErr)
}

Я также попытался использовать обратный вызов: однако, кажется, что указанный обратный вызов никогда не вводился.Вот как выглядел мой код:

var params = {
    Bucket: 'BUCKET NAME',
    Key: ""
}

// Some more code to determine file name, confirmed working

params.Key = 'FILE NAME'
s3.headObject(params, function(err: any, data: any) {
    console.log("We are in the callback")
    if (err) console.log(err, err.code)
    else {   
    // Do things with file
    }
})
console.log("We are not in the callback")

С этим кодом «Мы в обратном вызове» никогда не появлялись, в то время как «Мы ​​не в обратном вызове» отображались правильно.

Независимо от того, что я делаю, ошибки никогда не обнаруживаются.Из того, что я понимаю, из того, как должна работать функция, если файл не существует, предполагается, что он выдаст ошибку (затем перехватит мою перехватку), что позволит мне не создавать ложные URL с помощью функции getSignedUrl.

Что я здесь не так делаю?

Спасибо всем за ответы.Если у вас возникнут дополнительные вопросы, я буду рад ответить как можно лучше.

1 Ответ

0 голосов
/ 28 апреля 2019

Это правильный способ проверки существования объекта с использованием синтаксиса async / await:

// Returns a promise that resolves to true/false if object exists/doesn't exist
const objectExists = async (bucket, key) => {
  try {
    await s3.headObject({
      Bucket: bucket,
      Key: key,
    }).promise(); // Note the .promise() here
    return true; // headObject didn't throw, object exists
  } catch (err) {
    if (err.code === 'NoSuchKey') {
      return false; // headObject threw with NoSuchKey, object doesn't exist
    }
    throw err; // Rethrow other errors
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...