如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'?
Posted
技术标签:
【中文标题】如何在 AWS lambda 上使用 graphql \'isValidJSValue\' 或 \'coerceValue\'?【英文标题】:How to use graphql 'isValidJSValue ' or 'coerceValue' on AWS lambda?如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'? 【发布时间】:2019-06-26 14:26:51 【问题描述】:在我的应用程序的工作流程中,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 上运行时只返回一个“字符串”。
已经尝试使用“coerceValue”和“isValidJSValue”这两个函数,但没有成功。还尝试 Promisify 我的函数并使用 async/await 样式,但没有任何区别,同样的错误。
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"
.
有人遇到过类似的问题吗?欢迎任何帮助。
【问题讨论】:
【参考方案1】:实际上,根本与 GraphQL 库或 lambda 无关,问题是因为 SQS 消息正文上缺少 JSON.parse,这样我试图验证“字符串”,而不是对象。
【讨论】:
以上是关于如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'?
如何使用 Python 在 AWS Lambda 上运行 SQLAlchemy
如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?