Начальное значение таблицы DynamoDB работает в cli, но не AWS -SDK - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица с более чем 25 элементами, и я написал базовый c скрипт, чтобы разбить их на подмассивы по 25 элементов в каждом, а затем перебирать этот набор подмассивов для запуска команды пакетной записи элемента в AWS Клиент DynamoDB. Я получаю сообщение об ошибке проверки. Когда я запускаю тот же исходный файл через aws -cli, он отлично заполняет таблицу. Это заставляет меня думать, что это как-то связано с моим сценарием. Видите что-нибудь, чего мне не хватает? Заранее спасибо!

var { DynamoDB } = require('aws-sdk');
var db = new DynamoDB.DocumentClient({
  region: 'localhost',
  endpoint: 'http://localhost:8000',
});
const allItems = require('./allItems.json');
const tableName = 'some-table-name';
console.log({ tableName, allItems });
var batches = [];
var currentBatch = [];
var count = 0;
for (let i = 0; i < allItems.length; i++) {
  //push item to the current batch
  count++;
  currentBatch.push(allItems[i]);
  if (count === 25) {
    batches.push(currentBatch);
    currentBatch = [];
  }
}
//if there are still items left in the curr batch, add to the collection of batches
if (currentBatch.length > 0 && currentBatch.length !== 25) {
  batches.push(currentBatch);
}

var completedRequests = 0;
var errors = false;
//request handler for DynamoDB
function requestHandler(err, data) {
  console.log('In the request handler...');
  return function (err, data) {
    completedRequests++;
    errors = errors ? true : err;
    //log error
    if (errors) {
      console.error('Request caused a DB error.');
      console.error('ERROR: ' + err);
      console.error(JSON.stringify(err, null, 2));
    } else {
      var res = {
        statusCode: 200,
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Credentials': true,
        },
        body: JSON.stringify(data),
        isBase64Encoded: false,
      };
      console.log(`Success: returned ${data}`);
      return res;
    }
    if (completedRequests == batches.length) {
      return errors;
    }
  };
}

//Make request
var params;
for (let j = 0; j < batches.length; j++) {
  //items go in params.RequestedItems.id array
  //format for the items is {PutRequest : {Item: ITEM_OBJECT}}
  params = '{"RequestItems": {"' + tableName + '": []}}';
  params = JSON.parse(params);
  params.RequestItems[tableName] = batches[j];

  console.log('before db.batchWriteItem: ', params);

    try {
        //send to db
        db.batchWrite(params, requestHandler(params));
    } catch{
        console.error(err)
    }
}

Вот форматированный объект запроса и ошибка:

before db.batchWriteItem:  
{ RequestItems:
   { 'some-table-name': [ [Object], [Object], [Object], [Object] ] } 
}
In the request handler...
Request caused a DB error.
ERROR: ValidationException: Invalid attribute value type
{
  "message": "Invalid attribute value type",
  "code": "ValidationException",
  "time": "2020-08-04T10:51:13.751Z",
  "requestId": "dd49628c-6ee9-4275-9349-6edca29636fd",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 47.94198279972915
}

1 Ответ

1 голос
/ 04 августа 2020

Вы используете DocumentClient в коде nodejs. Это автоматически преобразует формат данных, используемый DynamoDB, в более удобный для использования формат.

например,

  {
     "id": {
       "S": "A string value"
     }
  }

превратится в

  {
     "id": "A string value"
  }

CLI не выполняет этого конверсия данных. Вы можете использовать обычный клиент DynamoDB, чтобы не выполнять это преобразование в Nodejs. например, const db = new Dynamodb()

...