我在Azure函数中托管了一个REST端点。当有人呼叫该端点时,我会像这样处理传入请求:
// Construct
const requestBody: RequestBody = new RequestBody(req.body)
// Class
export class RequestBody {
private _packages: IPackage[]
constructor(object: any) {
this._packages = object.packages
}
get packages(): IPackage[] {
return this._packages
}
}
// IPackage interface
export interface IPackage {
packageId: string
shipmentId: string
dimensions: IDimension
}
其中req.body
是从Azure功能的触发器接收的(源,如果相关(
在接收消息并构造对象时,有什么模式可以让我验证IPackage
接口中的所有属性是否存在?整个列表需要在接口中定义所有属性。
您可以使用如下isValid方法检查req.body:
export class RequestBody {
private _packages: IPackage[]
constructor(object: any) {
this._packages = object.packages
}
isValid(): boolean {
let bValid = Array.isArray(this._packages);
if (bValid) {
for(const entry of this._packages) {
if (!entry.packageId || typeof entry.packageId !== "string") {
bValid = false;
break;
}
// Check other attributes the same way and write some
// custom code for IDimension.
}
}
return bValid
}
get packages(): IPackage[] {
return this._packages
}
}
如果你想使用一个库进行模式验证,你可以看看joi。您可以在这里的模式测试程序中在线输入您的示例https://joi.dev/tester/.对于类型"IDimension",您需要编写一个子类型以通过joi进行验证。