Получение 'str.indexOf не является функцией' ошибка при попытке S3.getSignedUrl () - PullRequest
0 голосов
/ 19 февраля 2020

При попытке получить подписанный URL для getObject я получаю следующую ошибку из библиотеки aws-sdk:

<proj-dir>\node_modules\aws-sdk\lib\util.js:983
      return str && str.indexOf('arn:') === 0 && str.split(':').length >= 6;
                        ^

TypeError: str.indexOf is not a function
    at Object.validateARN [as validate] (<proj-dir>\node_modules\aws-sdk\lib\util.js:983:25)
    at features.constructor.hasBucketInParams [as isAccessPointApplicable] (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:180:2
3)
    at features.constructor.setupRequestListeners (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:126:14)
    at features.constructor.addAllRequestListeners (<proj-dir>\node_modules\aws-sdk\lib\service.js:276:10)
    at features.constructor.makeRequest (<proj-dir>\node_modules\aws-sdk\lib\service.js:203:10)
    at features.constructor.getSignedUrl (<proj-dir>\node_modules\aws-sdk\lib\services\s3.js:1026:24)
    at Object.<anonymous> (<proj-dir>\s3-test.js:101:8)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)

Другие вызовы S3 (например, listBuckets) работают нормально. Вот мой тестовый файл:

const S3 = require('./utils/s3Util');
const C = require('./utils/constants');
const _ = require('lodash');

// other code...

S3.svc.getSignedUrl('getObject', { Bucket: C.S3_BUCKET, Key: 'TestFrequencyCount.java', Expires: 60 }).promise()
    .then(retVal => {
        console.log("Return value:", retVal);
    }).catch(err => {
        console.log("Error::", err);
    });

Файл s3Util.js:

const C = require('./constants');
const AWS = require('aws-sdk');
const keys = require("../config/aws-config.json");

// AWS.config.update(keys);

const s3 = new AWS.S3({...keys, apiVersion: C.S3_API_VER, signatureVersion: 'v4' });

module.exports = Object.freeze({
    svc: s3,
});

Я использовал aws-sdk версия 2.610.0, затем обновил его до 2.621.0, но проблема остается.

Даже попытался изменить способ загрузки учетных данных учетной записи AWS (я буду использовать пользователя IAM после выяснения обстоятельств) на основе комбинации этой заметки из AWS документации SDK:

Примечание. Необходимо убедиться, что у вас есть stati c или ранее разрешенные учетные данные, если вы вызываете этот метод синхронно (без обратного вызова), иначе он может неправильно подписать запрос. Если вы не можете гарантировать это (вы используете асинхронный поставщик учетных данных, т. Е. Роли IAM в EC2), вы всегда должны вызывать этот метод с асинхронным обратным вызовом.

и решение, указанное в Node.js и aws ошибка учетных данных - json (в которой предлагалось не использовать AWS.config.loadFromPath(path), а вместо этого загружать параметры напрямую через AWS.config.update(...)), но безрезультатно.

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

S3.svc.getSignedUrl('getObject', { Bucket: C.S3_BUCKET, Key: 'TestFrequencyCount.java', Expires: 60 }, (err, retVal) => {
    if (err) {
        console.log("Error::", err);
    } else {
        console.log("Return value:", retVal);
    }
});

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Ошибка была с определением C.S3_BUCKET: его следовало использовать вместо: C.S3_BUCKET[process.env.NODE_ENV].

0 голосов
/ 19 февраля 2020
Переменная

str, вероятно, является объектом, а не строкой или массивом, поэтому метод indexOf не может быть применен к ней. Используйте console.log (str) для подтверждения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...