如何在AWS Lambda上使用graphql'isValidJSValue'或'coerceValue'?

时间:2019-02-02 01:30:53

标签: node.js aws-lambda graphql graphql-js aws-appsync

在我的应用程序的工作流程中,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"

有人有类似的问题吗?欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

实际上,与GraphQL库或lambda完全无关,问题是由于SQS消息正文上缺少JSON.parse,因此我试图验证“字符串”,而不是对象。 / p>