node.js - Loopback 4 如何验证 requestBody 属性

标签 node.js typescript loopbackjs

我正在寻找一种方法来防止不需要的属性出现在 requestBody 中,如关联模型中所述

这是我的模型:

import { Model, model, property } from '@loopback/repository';

@model({
   name: 'AwsS3',
   strict: true,
   description: 'AWS S3 Object description',
   properties: {
   Key: {
      type: 'String',
      required: 'true',
   },
   Bucket: {
      type: 'String',
      requied: 'true',
   },
 },
})
export class AwsS3 extends Model {
@property({
   type: 'string',
   description: 'path/to/file',
   required: true,
}) Key: string;

@property({
   type: 'string',
   description: 'AWS-S3-Bucket-Name',
   required: true,
})
Bucket: string;

constructor(data: AwsS3) {
  super(data);
 }
}

我在 Controller 中这样使用它

 function(@requestBody({
    required: true,
    description: 'aws object settings',
    content: {
       'application/json': {},
     },
   }) body : AwsS3
 ){
    console.log(body);
 }

当两个属性之一缺失或类型错误时,它会正确抛出。 但是,如果我发送如下所示的 json,则不会抛出任何内容,并且对象会使用 UnwantedProp 进行处理

{
    Key: 'key',
    Bucket : 'bucket',
    UnwantedProp: 40
}

最佳答案

我发现它可以通过使用 @api 装饰器并设置 openapi 规范中的additionalProperties: false 来实现。

像这样使用它:

 @api(
    basePath: '/',
    paths : {
       'somepath': {
           'post' : {
               'x-operation-name': 'myfunction',
               'x-controller-name': 'MyController',
               // properties for route
               requestBody: {
                  required: true,
                  content: {
                    'application/json': {
                       schema: {
                         type: 'object',
                         additionalProperties: false, // <=== here it is
                         properties: {
                            Key: { type: 'string'},
                            Bucket: {type: 'string'},
                         },
                         required: ['Bucket', 'Key'],
                       },
                   },
                 },
               },
            }
        }
    }
 )
 export class MyController{
    async myfunction(
       @requestBody({ settings: { strict: true } }) body
    ){}
 }

测试时它会按预期抛出以下内容:

{
    "error": {
        "statusCode": 422,
        "name": "UnprocessableEntityError",
        "message": "The request body is invalid. See error object `details` property for more info.",
        "code": "VALIDATION_FAILED",
        "details": [
            {
                "path": "",
                "code": "additionalProperties",
                "message": "should NOT have additional properties",
                "info": {
                    "additionalProperty": "unwantedProp"
                }
            }
        ]
    }
}

关于node.js - Loopback 4 如何验证 requestBody 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54289215/

相关文章:

javascript - 使用 node.js 将 JSON 从 AWS Lambda 保存到 AWS S3

javascript - async 是否使其内部的所有内容都异步?

arrays - 如何仅使用一个函数按属性对对象数组进行排序?

typescript - 为什么partialType 不使属性可以为空?

android - 如何使用 Strongloop Loopback REST API 包含和排序数组?

loopbackjs - 在环回文档中,变量 'cb' 代表什么?

node.js - 在 Elastic Beanstalk 上安装 mongodb 的推荐方法

node.js - socket.io 客户端连接断开

javascript - Angular 6 : Npm ERR! 缺少脚本:部署到 heroku 时启动

node.js - 如何在环回中定义自定义错误页面?