How to fix 'TypeError: Key must be a buffer at new Hmac (crypto.js:117:16)' when using ibm-cos-sdk
How to fix 'TypeError: Key must be a buffer at new Hmac (crypto.js:117:16)' when using ibm-cos-sdk
我尝试根据为 @cloudant/couchbackup 包提供的示例代码执行到 IBM COS 的 Cloudant 备份,并收到来自相关 Hmac 包的错误:"TypeError: Key must be a buffer at new Hmac (crypto.js:117:16)".
我调整了示例代码以使用我的特定源 (Cloudant) 和目标 (COS) 凭据,并基本保持示例代码的其他部分不变。 运行 它在 Ubuntu(在 Virtual Box 上)和 Windows 10 上的结果相同。其他测试脚本证明了对 Cloudant 和 COS 的一般访问。
我的server.js:
const stream = require('stream');
const url = require('url');
const IbmCos = require('ibm-cos-sdk');
const couchbackup = require('@cloudant/couchbackup');
const debug = require('debug')('s3-backup');
const VError = require('verror').VError;
// COS properties
const ibmAuthEndpointUrl = 'https://iam.ng.bluemix.net/oidc/token';
var backupBucket = process.env.COS_BUCKET;
var s3config = {
endpoint: process.env.COS_ENDPOINT,
apiKeyId: process.env.COS_API_KEY,
ibmAuthEndpoint: ibmAuthEndpointUrl,
serviceInstanceId: process.env.COS_RES_INST,
};
// Cloudant properties
const sourceUrl = process.env.COUCH_URL;
const sourceDbName = process.env.COUCH_DATABASE;
const sourceUrlExt = sourceUrl + '/' + sourceDbName;
const shallow = false;
// Create the COS client for the configuration:
var ibmS3Client = new IbmCos.S3(s3config);
const backupKeyPrefix = "A";
const backupKey = `${backupKeyPrefix}-${new Date().toISOString()}`;
debug(`Creating a new backup of ${s(sourceUrlExt)} at ${backupBucket}/${backupKey}...`);
bucketAccessible(ibmS3Client, backupBucket)
.then(() => {
return backupToS3(sourceUrlExt, ibmS3Client, backupBucket, backupKey, shallow);
})
.then(() => {
debug('done.');
})
.catch((reason) => {
debug(`Error: ${reason}`);
process.exit(1);
});
上面代码的主要部分和函数bucketAccessible
、backupToS3
和s
来自示例script。
运行 server.js
我希望从 Cloudant 导出的文本文件存储在 COS 中。但是,这是我得到的错误:
$ DEBUG=s3-backup node server.js
s3-backup Creating a new backup of https://<mytenant>-bluemix.cloudant.com/test-48hg at dch-48h-backup01/A-2019-02-13T13:28:38.719Z... +0ms
s3-backup Setting up S3 upload to ${s3Bucket}/${s3Key} +1s
s3-backup Starting streaming data from ${sourceUrl} +1ms
s3-backup Download from ${sourceUrl} complete. +717ms
s3-backup S3 upload done +5ms
s3-backup TypeError: Key must be a buffer
s3-backup at new Hmac (crypto.js:117:16)
s3-backup at Object.createHmac (crypto.js:643:10)
s3-backup at Object.hmac (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\util.js:400:30)
s3-backup at Object.getSigningKey (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4_credentials.js:59:8)
s3-backup at V4.signature (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:95:36)
s3-backup at V4.authorization (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:90:36)
s3-backup at V4.addAuthorization (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:32:12)
s3-backup at C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\event_listeners.js:199:18
s3-backup at finish (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\config.js:308:7)
s3-backup at C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\config.js:324:9 +0ms
s3-backup Error: Error: S3 upload failed +2ms
显然,ibm-cos-sdk 没有正确安装。在 运行ning npm install ibm-cos-sdk
之后它运行良好。不确定为什么 const IbmCos = require('ibm-cos-sdk');
不够。也许这是对 npm 知识渊博的人(当然不是我)的另一个问题。
我还设法 运行 使用 aws-sdk 对实例化客户端稍作修改的相同脚本。
我尝试根据为 @cloudant/couchbackup 包提供的示例代码执行到 IBM COS 的 Cloudant 备份,并收到来自相关 Hmac 包的错误:"TypeError: Key must be a buffer at new Hmac (crypto.js:117:16)".
我调整了示例代码以使用我的特定源 (Cloudant) 和目标 (COS) 凭据,并基本保持示例代码的其他部分不变。 运行 它在 Ubuntu(在 Virtual Box 上)和 Windows 10 上的结果相同。其他测试脚本证明了对 Cloudant 和 COS 的一般访问。
我的server.js:
const stream = require('stream');
const url = require('url');
const IbmCos = require('ibm-cos-sdk');
const couchbackup = require('@cloudant/couchbackup');
const debug = require('debug')('s3-backup');
const VError = require('verror').VError;
// COS properties
const ibmAuthEndpointUrl = 'https://iam.ng.bluemix.net/oidc/token';
var backupBucket = process.env.COS_BUCKET;
var s3config = {
endpoint: process.env.COS_ENDPOINT,
apiKeyId: process.env.COS_API_KEY,
ibmAuthEndpoint: ibmAuthEndpointUrl,
serviceInstanceId: process.env.COS_RES_INST,
};
// Cloudant properties
const sourceUrl = process.env.COUCH_URL;
const sourceDbName = process.env.COUCH_DATABASE;
const sourceUrlExt = sourceUrl + '/' + sourceDbName;
const shallow = false;
// Create the COS client for the configuration:
var ibmS3Client = new IbmCos.S3(s3config);
const backupKeyPrefix = "A";
const backupKey = `${backupKeyPrefix}-${new Date().toISOString()}`;
debug(`Creating a new backup of ${s(sourceUrlExt)} at ${backupBucket}/${backupKey}...`);
bucketAccessible(ibmS3Client, backupBucket)
.then(() => {
return backupToS3(sourceUrlExt, ibmS3Client, backupBucket, backupKey, shallow);
})
.then(() => {
debug('done.');
})
.catch((reason) => {
debug(`Error: ${reason}`);
process.exit(1);
});
上面代码的主要部分和函数bucketAccessible
、backupToS3
和s
来自示例script。
运行 server.js
我希望从 Cloudant 导出的文本文件存储在 COS 中。但是,这是我得到的错误:
$ DEBUG=s3-backup node server.js
s3-backup Creating a new backup of https://<mytenant>-bluemix.cloudant.com/test-48hg at dch-48h-backup01/A-2019-02-13T13:28:38.719Z... +0ms
s3-backup Setting up S3 upload to ${s3Bucket}/${s3Key} +1s
s3-backup Starting streaming data from ${sourceUrl} +1ms
s3-backup Download from ${sourceUrl} complete. +717ms
s3-backup S3 upload done +5ms
s3-backup TypeError: Key must be a buffer
s3-backup at new Hmac (crypto.js:117:16)
s3-backup at Object.createHmac (crypto.js:643:10)
s3-backup at Object.hmac (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\util.js:400:30)
s3-backup at Object.getSigningKey (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4_credentials.js:59:8)
s3-backup at V4.signature (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:95:36)
s3-backup at V4.authorization (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:90:36)
s3-backup at V4.addAuthorization (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\signers\v4.js:32:12)
s3-backup at C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\event_listeners.js:199:18
s3-backup at finish (C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\config.js:308:7)
s3-backup at C:\Users\StefanVogel\Documents\GitHubhg-backup\node_modules\ibm-cos-sdk\lib\config.js:324:9 +0ms
s3-backup Error: Error: S3 upload failed +2ms
显然,ibm-cos-sdk 没有正确安装。在 运行ning npm install ibm-cos-sdk
之后它运行良好。不确定为什么 const IbmCos = require('ibm-cos-sdk');
不够。也许这是对 npm 知识渊博的人(当然不是我)的另一个问题。
我还设法 运行 使用 aws-sdk 对实例化客户端稍作修改的相同脚本。