(追記)DocumentClient には空文字を NULL 型に変換するためのオプトイン機能が存在する、というコメントをいただきました。
DynamoDB は空の値を登録できないけど DynamoDB document client のコンストラクタにオプションを渡すだけで空の値を NULL 型には変換できるよ?
記事を削除しようとも思ったのですが、検索で引っかかって見にきた人のリンクになると思ったので、ひとまず記事自体は残しておきます。
いつか余裕がある時に書き直すかもしれません。。
DynamoDB は空文字を登録できないため、空文字チェックしてエラー回避する実装にする必要があります。
が、JSONとかの関係でどうしても登録したい場合は、以下のように単純にスペースで登録するとよいかもしれません。
ちなみに Lambda - Node.js 6.10 での例です。
'use strict';
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
// 空文字チェック
// ※DynamoDBの仕様で空文字を登録できないため、半角スペースで登録
let resourcesPara = ' ';
if (event.resources !== undefined && event.resources.length > 0) {
resourcesPara = event.resources;
}
const params = {
TableName: "tableName",
Item: {
"id": "newId",
"resources": resourcesPara
}
};
docClient.put(params, function(err, data) {
if (err) {
console.error('Unable to add item. Error JSON:', JSON.stringify(err, null, 2));
// エラー
callback(null, err);
} else {
console.log('Added item:', JSON.stringify(data, null, 2));
callback(null, {"id": "newId"});
}
});
};
取得するときも単純に半角スペースを空文字にして返却。
'use strict';
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
const params = {
TableName: "tableName"
};
docClient.scan(params, function(err, data) {
if (err) {
console.error('Unable to get item. Error JSON:', JSON.stringify(err, null, 2));
// エラー
callback(null, err);
} else {
if (data.Count > 0) {
// データあり
for (let i = 0; i < data.Count; i++) {
// スペースのみの場合空文字にする
// ※DynamoDBの仕様で空文字を登録できないため、半角スペースで登録している
if (data.Items[i].resources === ' ') {
data.Items[i].resources = '';
}
}
callback(null, data.Items);
} else {
// データなし
callback(null, '404 Not Found. Data is nothing.');
}
}
});
};