Я пытаюсь обновить подписку 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 под названием «карта», поэтому, вероятно, он зашифрован.
У кого-нибудь есть опыт в этом? Это моя лямбда-функция, как я уже сказал, она работает только с RekognitionId, отформатированным как полу-json-строка DynamoDb {"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.info('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.info('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.info('LAMBDA results of query: ', data);
callback(data);
})
.catch((error)=>{
console.info('LAMBDA ERROR:', error);
callback(error);
});
});
};
@Trilliput ошибка исходит из шаблона VTL, но они были автоматически сгенерированы AWS appsync и работают из консоли appsync.
не стесняйтесь принять мой ответ.





Я часто встречал эту ошибку (к сожалению!), и она плохо сформулирована, поскольку не имеет никакого отношения к тому, как мы можем думать. Ошибка заключается в том, что ваша строка подключения graphql сформирована неправильно или в ней отсутствует ключевой фрагмент данных.
Есть два решения. Первый — опробовать graphql в какой-нибудь песочнице AWS Amplify и Apollo, обе они есть в консоли. В случае AWS вы также можете имитировать свою базу данных и запускать ее со своего компьютера, хотя вам нужно создать некоторые данные в вашей имитируемой среде, и очистить их, прежде чем продолжить, если вы разрабатываете на локальной машине как два набора данных - настоящее и фиктивное переплетаются! Да, потерял несколько часов на этом!
Другое решение состоит в том, чтобы просто вывести строку данных, независимо от того, на какие данные вы полагаетесь в запросе, чтобы убедиться, что данные присутствуют. Как иногда все выглядит хорошо, но эта ошибка имеет тенденцию возникать при отсутствии данных.
Вы можете протестировать данные. Получите хорошую строку данных, а затем преднамеренно возьмите требуемую! или другой элемент, и в какой-то момент вы получите ошибку сопоставления. Это относится к тому, что graphql не может отображать данные, а не к значению карты в javascript.
Это звучит как решение, но не могли бы вы предоставить некоторые подробности о том, как выглядят искаженные данные и как они должны выглядеть?
ответ, над которым я работал в то время, был упомянут в ОП. Больше информации дать не могу, так как это было давно.
У меня была такая же ошибка на этой неделе и много времени. Причиной для меня была просто проверка того, что я передал в качестве переменной для моей мутации GraphQL. Прежде всего, я передавал число, а не объект (т.е. я случайно передавал ключ, выполняя цикл for x), а затем, во-вторых, я выполнял JSON.stringify для входной переменной для моей мутации. Они вместе вызвали много головных уборов. Добавляю его сюда на всякий случай, если кто-то еще столкнется с этой ошибкой. ПРОВЕРЬТЕ, ЧТО ВЫ ПЕРЕДАЕТЕ!
Застрял с той же проблемой .. потерял прямо сейчас.
Это ошибка шаблона VTL. Трудно сказать, не видя шаблона, но «Map» и «String» определенно являются типами VTL и похоже, что где-то строковое значение присваивается входному объекту, когда оно должно было быть значением типа map. Вероятно, строка json не была преобразована в карту.
У меня была точно такая же ошибка в моей реализации.
Причиной для меня было то, что мой UpdateFaceInput не имел такой же внутренней структуры, как мой UpdateFace тип.
Поэтому, если у кого-то возникла эта ошибка, просто хотел намекнуть, что просмотр ваших определений type updateFace и input updateFaceInput также может быть хорошей попыткой.
Если вы пытаетесь запросить или изменить на основе условий, вам нужно использовать некоторые предложения условия, видимые здесь. Например, ваш код должен выглядеть примерно так:
await client.mutate({
mutation: query,
variables: {
input: {
RekognitionId: {eq: inputObj.RekognitionId},
Emotion: {eq: []}
}
},
fetchPolicy: 'no-cache'
}).then(function logData(data) {
console.info('LAMBDA results of query: ', data);
callback(data);
})
.catch((error)=>{
console.info('LAMBDA ERROR:', error);
callback(error);
});
Ошибка «Карта», на мой взгляд, глупая, она не дает вам много работы. Эта ошибка может относиться и к другим проблемам, но похоже, что большинство этих проблем связаны с условиями.
Это больше похоже на ошибку шаблона VTL. Вы уверены, что мутация работает? Вы пытались выполнить мутацию вручную?