使用 NodeJS 发送基于 DynamoDb 流的 graphQL 突变

Jes*_*und 7 amazon-web-services node.js amazon-dynamodb aws-lambda graphql

当 DynamoDb 表收到新行时,我正在尝试更新 GraphQL 订阅。我得到的以下代码仅适用于 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'."

不幸的是,我找不到对称为“map”的 GraphQL 类型的单个引用,因此它可能被打乱了。

有没有人有这方面的经验?这是我的 Lambda 函数,就像我说的那样,它只适用于格式化为 dynamoDb 半json-string 的 RekognitionId{"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);
        });

    });
};
Run Code Online (Sandbox Code Playgroud)

Dav*_*ite 4

我经常看到这个错误(可悲的是!),而且它的措辞很糟糕,因为它没有提及映射我们可能的思维方式。错误是您的 graphql 连接字符串格式错误或者缺少关键数据。

有两种解决方案。第一个是在某种沙箱中尝试 graphql AWS Amplify 和 Apollo 都在控制台中提供了它们。对于 AWS,您还可以模拟数据库并从您的计算机运行它 - 尽管您需要在模拟环境中创建一些数据 - 如果您在本地计算机上作为两组数据进行开发,则在继续之前清除它- 真实与模拟交织在一起!是的,在那件事上浪费了几个小时!

另一个解决方案是简单地控制台出数据字符串,无论您在查询中依赖什么数据来确保数据存在。有时,一切看起来都不错,但当数据丢失时,往往会发生该错误。

你可以测试一下数据。拿到好数据串然后刻意取需要的!element out 或其他,您有时会遇到映射错误。这是指graphql无法映射数据,而不是map的javascript含义。