Подключите мобильный сервер AWS к DynamoDB - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь использовать мобильный бэкэнд AWS (используя лямбда-функцию) для вставки в DynamoDB (также настроенный на мобильном бэкенде), но пока безуспешно.

Соответствующий код:

'use strict';
console.log("Loading function");

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:process.env.MOBILE_HUB_PROJECT_REGION});



exports.handler = function(event, context, callback) {
    var responseCode = 200;
    var requestBody, pathParams, queryStringParams, headerParams, stage,
    stageVariables, cognitoIdentityId, httpMethod, sourceIp, userAgent,
    requestId, resourcePath;
    console.log("request: " + JSON.stringify(event));

    // Request Body
    requestBody = event.body;

    if (requestBody !== undefined && requestBody !== null) {

        // Set 'test-status' field in the request to test sending a specific response status code (e.g., 503)
        responseCode = JSON.parse(requestBody)['test-status'];
    }

    // Path Parameters
    pathParams = event.path;

    // Query String Parameters
    queryStringParams = event.queryStringParameters;

    // Header Parameters
    headerParams = event.headers;

    if (event.requestContext !== null && event.requestContext !== undefined) {

        var requestContext = event.requestContext;

        // API Gateway Stage
        stage = requestContext.stage;

        // Unique Request ID
        requestId = requestContext.requestId;

        // Resource Path
        resourcePath = requestContext.resourcePath;

        var identity = requestContext.identity;

        // Amazon Cognito User Identity
        cognitoIdentityId = identity.cognitoIdentityId;

        // Source IP
        sourceIp = identity.sourceIp;

        // User-Agent
        userAgent = identity.userAgent;
    }

    // API Gateway Stage Variables
    stageVariables = event.stageVariables;

    // HTTP Method (e.g., POST, GET, HEAD)
    httpMethod = event.httpMethod;

    // TODO: Put your application logic here...

    let params = {
        Item:{
            "prop1":0,
            "prop2":"text"
        },
        TableName:"testTable"
    };

    docClient.put(params, function(data, err){
        if(err)
            responseCode = 500;
        else
            {
                responseCode = 200;
                context.succeed(data);
            }
    });

    // For demonstration purposes, we'll just echo these values back to the client
    var responseBody = {
        requestBody : requestBody,
        pathParams : pathParams,
        queryStringParams : queryStringParams,
        headerParams : headerParams,
        stage : stage,
        stageVariables : stageVariables,
        cognitoIdentityId : cognitoIdentityId,
        httpMethod : httpMethod,
        sourceIp : sourceIp,
        userAgent : userAgent,
        requestId : requestId,
        resourcePath : resourcePath
    };

    var response = {
        statusCode: responseCode,
        headers: {
            "x-custom-header" : "custom header value"
        },
        body: JSON.stringify(responseBody)
    };
    console.log("response: " + JSON.stringify(response))
    context.succeed(response);
};

по какой-то причине это не ставит предмет на стол.Я дал необходимые разрешения, используя часть ролей, что-то мне не хватает?

** responseCode предназначен только для целей тестирования.

Редактировать: пробовал AWS node.js лямбда-запрос dynamicodb, нонет ответа (нет ошибок, нет возвращаемых данных) и тоже не работает.

Edit2: добавлен полный код обработчика.(это код, сгенерированный по умолчанию при создании первой лямбды AWS).

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Причина, по которой данные не записываются в таблицу, заключается в том, что вызов DynamoDB put является асинхронным и будет возвращаться при вызове вашего обратного вызова. Но в течение этого времени остальная часть кода продолжает выполняться, и ваша функция в конечном итоге завершает работу, прежде чем вызов DynamoDB сможет завершиться.

Вы можете использовать ключевые слова await / async, чтобы сделать ваш код синхронным:

async function writeToDynamoDB(params) {
 return new Promise((resolve,reject) => {
    docClient.put(params, function(data, err){
        if(err)
            reject(500);
        else
            resolve(data);
     });
 });
}

let params = ...
var data = await writeToDynamoDB(params)

Вы можете найти пример кода, который я написал (в Typescript) на https://github.com/sebsto/maxi80-alexa/blob/master/lambda/src/DDBController.ts

1 голос
/ 08 марта 2019

Я реорганизовал некоторые фрагменты вашего кода, чтобы они выглядели намного проще, и использую async / await (убедитесь, что в качестве рабочей среды для вашей функции выбран Node 8.10) вместо обратных вызовов. Я также избавился от параметров context и callback, так как они использовались для более старых версий NodeJS. Как только вы используете Node 8+, async / await должен быть вариантом по умолчанию.

Кроме того, можно связать .promise () с docClient.putItem, чтобы вы могли легко ожидать его, что упрощает ваш код. Я оставил только часть DynamoDB (что относится к вашему вопросу)

'use strict';
console.log("Loading function");

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:process.env.MOBILE_HUB_PROJECT_REGION});

exports.handler = async (event) => {

    let params = {
        Item:{
            "prop0":1,
            "prop2":"text"
        },
        TableName:"testTable"
    };

    try {
      await docClient.put(params).promise();
    } catch (e) {
      console.log(e)
      return {
        messsage: e.message
      }
    }

    return { message: 'Data inserted successfully' };

};

Что нужно иметь в виду, если все еще не работает:

  1. Убедитесь, что у вашей лямбда-функции есть необходимые разрешения для вставки элементов в DynamoDB (AmazonDynamoDBFullAccess сделает это)

  2. Вы ВСЕГДА должны указывать ключ разделения при вставке элементов в DynamoDB. В вашем примере JSON имеет только два свойства: prop1 и prop2. Если ни один из них не является ключом раздела, ваш код обязательно завершится ошибкой.

  3. Убедитесь, что ваша таблица также существует

Если код не работает, просто проверьте журналы CloudWatch, так как теперь все исключения регистрируются и выводятся на консоль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...