TransWikia.com

DynamoDBでシーケンス発行後に値を取得したい

スタック・オーバーフロー Asked by Saya on December 24, 2021

Lambda + DynamoDBでアトミックカウンターのついたPOSTを開発しています。
①sequenceテーブル②licenseテーブルあるのですが、シーケンス発行後に値を②licenseテーブルに入れたいです。
"id": table.idで定義しているのですが入らないようで。。もしやり方をご存じの方いらっしゃれば教えていただきたいです。

const aws = require('aws-sdk');
aws.config.update({region: 'ap-northeast-1'});

const dynamodb = new aws.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});
const table = 'license';
const sequenceTable = 'sequences';

// Sequence 処理
function sequence(license_id, callback) {
    const params = {
        TableName: "sequences",
        Key: {
            name: "license"
        },
        UpdateExpression: "ADD current_number :val",
        ExpressionAttributeValues: {
            ":val":1
        },
        ReturnValues: "UPDATED_NEW"
    };
    dynamodb.update(params, function(err, data) {
        let id;
        if (err) {
            console.error('Unable to update item. Error JSON:', JSON.stringify(err, null, 2));
        } else {
            console.log('UpdateItem succeeded:', JSON.stringify(data, null, 2));
            id = data.Attributes.current_number;
        }
        callback(id);
    });
}

//POST 処理
const params = {
    Item: {
        "licensekey": "dapfddd4daaaf",
        "status": "未登録",
        "staff_mail": "[email protected]",
        "license_create_date": Date.now(),
        "id": table.id
    },
    ReturnConsumedCapacity: "TOTAL",
    TableName: "license"
};

//let responseData = {};
exports.handler = function(event, context, callback) {
    dynamodb.put(params, function(err, data) {
        console.log("callback response " + JSON.stringify(event['body-json']));
        sequence(sequenceTable, function(id) {
        console.log("sequence:" + id);
        });
        callback(null, {"message":"成功"});
        
        if (err) console.log(err, err.stack);
        else return data;
    });
};

One Answer

アトミックカウンターの値を取得後にputするデータにidをセットしてputする必要があるので、put後のfunctionでsequenceを呼ぶのでは値は設定されません。

sequence(sequenceTable, function(id){
  //ここでidをparamsのItem.idに設定して、putを呼ぶ。

とすれば良いかと思います。

Answered by nazozen on December 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP