gpt4 book ai didi

javascript - 尝试 S3.getSignedUrl() 时出现 'str.indexOf is not a function' 错误

转载 作者:行者123 更新时间:2023-12-02 21:44:24 37 4
gpt4 key购买 nike

在尝试获取 getObject 的签名 URL 时,我从 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,但问题仍然存在。

甚至尝试根据 this note 的组合更改加载 AWS 帐户凭证的方式(一旦我弄清楚了事情,将使用 IAM 用户)来自AWS SDK文档:

Note: You must ensure that you have static or previously resolvedcredentials if you call this method synchronously (with no callback),otherwise it may not properly sign the request. If you cannotguarantee this (you are using an asynchronous credential provider,i.e., EC2 IAM roles), you should always call this method with anasynchronous callback.

以及 Node.js and aws credentials error - 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);
}
});

最佳答案

错误在于 C.S3_BUCKET 的定义:它应该被用作:C.S3_BUCKET[process.env.NODE_ENV]

关于javascript - 尝试 S3.getSignedUrl() 时出现 'str.indexOf is not a function' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60295031/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com