如何在 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'?

如何使用AWS Lambda函数在本地系统上执行文件

如何使用 Python 在 AWS Lambda 上运行 SQLAlchemy

如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

如何在 AWS Lambda 上安装 GraphicsMagick 或 ImageMagick?

如何在 AWS Lambda 上的无服务器应用程序中存储和使用 HTML 模板(使用 AWS SAM)?