我正在try 使用query和JSON模式获取所有记录,但我一直得到Event object failed validation条记录,除非我通过了一个查询,它没有给我任何结果.

这个案子用了@middy/validator个任何人都已经2天了我还是不知道问题出在哪里

JSON模式文件

const getAuctionsSchema = {
    type: 'object',
    required: ['queryStringParameters'],
    properties: {
        queryStringParameters: {
            type: 'object',
            required: ['status'],
            properties: {
                status: {
                    default: 'OPEN',
                    enum: ['OPEN', 'CLOSED'],
                },
            },
        },
    },
};

module.exports = getAuctionsSchema;

这里是所有记录获取文件

const AWS = require('aws-sdk');
const createError = require('http-errors');
const validator = require('@middy/validator');
const commonMiddleware = require('../lib/commonMiddleware');
const getAuctionsSchema = require('../lib/schemas/getAuctionsSchema');

const dynamoDB = new AWS.DynamoDB.DocumentClient();

const get_auctions = async (event) => {
    const { status } = event.queryStringParameters;
    let auctions;

    const params = {
        TableName: process.env.AUCTIONS_TABLE_NAME,
        IndexName: 'statusAndEndDate',
        KeyConditionExpression: '#status = :status',
        ExpressionAttributeValues: {
            ':status': status,
        },
        ExpressionAttributeNames: {
            '#status': 'status',
        },
    };

    try {
        const result = await dynamoDB.query(params).promise();

        auctions = result.Items;
    } catch (err) {
        console.log(err);
        throw new createError.InternalServerError(err);
    }

    return {
        statusCode: 200,
        body: JSON.stringify(auctions),
    };
};

module.exports = {
    handler: commonMiddleware(get_auctions).use(
        validator({
            inputSchema: getAuctionsSchema,
            ajvOptions: {
                useDefaults: true,
                strict: false,
            },
        })
    ),
};

以下是我在Cloud Watch中看到的错误

ERROR   BadRequestError: Event object failed validation
at createError (/var/task/node_modules/@middy/util/index.js:259:10)
    at validatorMiddlewareBefore (/var/task/node_modules/@middy/validator/index.js:55:21)
    at runMiddlewares (/var/task/node_modules/@middy/core/index.js:120:88)
    at async runRequest (/var/task/node_modules/@middy/core/index.js:80:5) {
  details: [
    {
      instancePath: '',
      schemaPath: '#/required',
      keyword: 'required',
      params: [Object],
      message: 'must have required property queryStringParameters'
    }
  ]
}

推荐答案

验证器需要类型为objectqueryStringParameters属性.根据JSON Schema Specification for Objects,如果一个属性被声明为具有特定类型,那么如果该属性具有不同的类型,则该属性的验证将失败.

如果不将任何查询参数传递给Api网关(在Lambda代理集成中),queryStringParameters将为null,但您已指定它必须是对象和null is not an object.

可以在模式type: ['object', 'null']中指定几个允许的类型.您可以阅读更多关于使用多种类型的信息.


编辑:

const getAuctionsSchema = {
    type: 'object',
    required: ['queryStringParameters'],
    properties: {
        queryStringParameters: {
            type: 'object',
            required: ['status'],
            default: {status: 'OPEN'},
            properties: {
                status: {
                    default: 'OPEN',
                    enum: ['OPEN', 'CLOSED'],
                },
            },
        },
    },
};

Node.js相关问答推荐

Mongoose更新许多不使用数组作为筛选器来更新记录

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

Express Web 服务器部署到 prod 但 GET 返回超时错误

Mongodb - 在数组数组中查找()

如何从mongoose 对象内嵌套的数组中提取数组元素?

AWS ECS 服务发现 Cors 问题?

如何在mongodb中获取对象数组内部的数据

加速 sequelize ORM 中的查询

在快速路由中使用 axios 会在数据字段中返回特殊字符而不是 json

MongoDB 根据使用聚合的条件从嵌套数组中删除对象

将已保存的卡片从条带显示到前端

NestJS 共享模块的问题

2 x 匹配标准显示没有结果

突然 React 无法执行create-react-app命令.为什么会发生这种情况,我该如何解决?

无法更新MongoDB中的文档:";伯森场';writeConcern.w';是错误的类型';数组'&引用;

如何正确使用 package.json 中的关键字属性?

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

node.js 服务器和 HTTP/2 (2.0) 与 express.js

在 Node.js 中混合使用 JavaScript 和 TypeScript

如何创建安全(TLS/SSL)Websocket 服务器