【发布时间】:2019-08-04 16:12:41
【问题描述】:
我正在尝试在 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 semi-json-string {"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);
});
});
};
【问题讨论】:
-
看起来更像是 VTL 模板错误。你确定突变有效吗?您是否尝试手动执行突变?
-
@Trilliput 错误来自 VTL 模板,但这些错误是由 AWS appsync 自动生成并在 appsync 控制台中工作的。
-
欢迎接受我的回答。
标签: node.js amazon-web-services aws-lambda amazon-dynamodb graphql