在我的应用程序的工作流程中,AppSync会将用户输入(作为消息)传递到SQS队列,这将触发lambda进行异步处理。
Lambda将针对GraphQLInputType验证消息。为此,我使用了graphql-js的函数coerceValue
。得到了这个问题How can I use isValidJSValue to validate a query variable in my client code?的提示,正是我所需要的。
问题是,在nodejs中运行本地测试时,验证代码可以完美运行,但是当部署到AWS时,相同的代码将失败,并显示以下消息:
["Expected type CreateBookInput to be an object."]
。
显然schema.getType(inputType)
行在aws上运行时仅返回一个'string'。
已经尝试使用'coerceValue'和'isValidJSValue'这两个函数,但是没有成功。还尝试使我的功能更加多样化,并使用异步/等待样式,但没有任何区别,相同的错误。
function validate(object, inputType) {
let schema = loadSchema()
let validationResult = coerceValue(object, schema.getType(inputType))
if (validationResult.errors) {
throw new Error(`GraphQL: ${validationResult.errors}`)
}
return true
}
function loadSchema() {
let schemaFile = fs.readFileSync(path.join(__dirname, 'schema.graphql'), 'utf8'),
awsTypesSchema = fs.readFileSync(path.join(__dirname, 'aws.graphql'), 'utf8')
return buildSchema(schemaFile += awsTypesSchema)
}
在本地运行时,我可以看到schema.getType(inputType)
返回一个GraphQLInputObjectType
,但行为在AWS Lambda上有所不同,在日志中它仅返回输入类型的名称,例如"CreateBookInput"
。
有人有类似的问题吗?欢迎任何帮助。
答案 0 :(得分:1)
实际上,与GraphQL库或lambda完全无关,问题是由于SQS消息正文上缺少JSON.parse,因此我试图验证“字符串”,而不是对象。 / p>