Отправить мутацию graphQL на основе потока DynamoDb с NodeJS - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь обновить подписку GraphQL, когда таблица DynamoDb получает новую строку.Я получил следующий код, работающий только с RekognitionId, но я не пытаюсь отправить весь объект NewImage и не могу заставить его работать.Я получаю всевозможные проблемы с типами, но без реальной информации, чтобы решить их.Наиболее показательным было:

"Error: GraphQL error: Variable 'input' has an invalid value. Expected type 'Map' but was 'String'. Variables for input objects must be an instance of type 'Map'."

К сожалению, я не могу найти ни одной ссылки на тип GraphQL под названием "map", поэтому он, вероятно, зашифрован.

У кого-нибудь есть опыт этого?Это моя лямбда-функция, как я уже говорил, она работала только с RekognitionId, отформатированным как полу-json-строка dynamicoDb {"S": "id"}

global.WebSocket = require('ws');
require('es6-promise').polyfill();
require('isomorphic-fetch');
const AWS = require('aws-sdk');
const aws_exports = require('./aws-exports').default;
const AWSAppSyncClient = require('aws-appsync').default;

exports.handler = async (event, context, callback) => {
    if(!event.Records.length){
        console.log('no records');
        return false;
    }
    const AUTH_TYPE = require('aws-appsync/lib/link/auth-link').AUTH_TYPE;
    const url = aws_exports.ENDPOINT;
    const region = aws_exports.REGION;
    const type = AUTH_TYPE.AMAZON_COGNITO_USER_POOLS;

    AWS.config.update({
        region: aws_exports.REGION,
        credentials: new AWS.Credentials({
            accessKeyId: aws_exports.AWS_ACCESS_KEY_ID,
            secretAccessKey: aws_exports.AWS_SECRET_ACCESS_KEY
        })
    });
    const cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-18' });

    const initiateAuth = async ({ clientId, username, password }) => cognitoIdentityServiceProvider.initiateAuth({
        AuthFlow: 'USER_PASSWORD_AUTH',
        ClientId: clientId,
        AuthParameters: {
            USERNAME: username,
            PASSWORD: password,
        },
    }).promise();
    const { AuthenticationResult } = await initiateAuth({
        clientId: '*******',
        username: '*******',
        password: '*******',
    });
    const accessToken = AuthenticationResult && AuthenticationResult.AccessToken;

    // Import gql helper and craft a GraphQL query
    const gql = require('graphql-tag');
    const query = gql(`
    mutation faceAdded($input: UpdateFaceInput!) {
        updateFace(input: $input) { 
            RekognitionId
            Emotions {
                Confidence
                Type
            }
            AgeRange
            Beard
            Mustache
            Gender
            Eyeglasses
        }
    }`);
    // Set up Apollo client
    const client = new AWSAppSyncClient({
        url: url,
        region: region,
        auth: {
            type: type,
            jwtToken: accessToken,
        },
        disableOffline: true      //Uncomment for AWS Lambda
    });
    return runMutationInClient(client, query, event.Records[0], (res) => {
        return res;
    });
}

const runMutationInClient = async (client, query, RekognitionObj, callback) => {
    await client.hydrated().then( async (client) => {
        console.log('Running mutation in Lambda: ', query, 'RekognitionId: ', RekognitionObj);

        var inputObj = AWS.DynamoDB.Converter.unmarshall(RekognitionObj.dynamodb.NewImage)

        await client.mutate({
            mutation: query,
            variables: {
                input: {
                    RekognitionId: {"S": inputObj.RekognitionId},
                    Emotion: {"L": []}
                }
            },
            fetchPolicy: 'no-cache'
        }).then(function logData(data) {
            console.log('LAMBDA results of query: ', data);
            callback(data);
        })
        .catch((error)=>{
            console.log('LAMBDA ERROR:', error);
            callback(error);
        });

    });
};
...