Custom error wrapping validation errors with context.
class ParseError extends Error {
name: string; // "ParseError"
message: string; // Error description
cause?: unknown; // Original error (e.g., ZodError)
}Usage:
import { parse, ParseError } from '@aws-lambda-powertools/parser';
import { EventBridgeSchema } from '@aws-lambda-powertools/parser/schemas';
try {
const event = parse(data, undefined, EventBridgeSchema);
} catch (error) {
if (error instanceof ParseError) {
console.error('Parsing failed:', error.message);
console.error('Caused by:', error.cause);
}
}Error messages:
"Failed to parse schema. This error was caused by: <details>""Failed to parse EventBridge envelope. This error was caused by: <details>""Failed to parse SQS Record at index 2. This error was caused by: <details>"Returns ParsedResult instead of throwing.
type ParsedResult<Input, Output> =
| { success: true; data: Output }
| { success: false; error: Error; originalEvent?: Input };const result = parse(event, EventBridgeEnvelope, orderSchema, true);
if (result.success) {
console.log(result.data.orderId);
} else {
console.error(result.error.message);
console.error(result.originalEvent);
}import { parser } from '@aws-lambda-powertools/parser';
import { SqsEnvelope } from '@aws-lambda-powertools/parser/envelopes';
import type { ParsedResult } from '@aws-lambda-powertools/parser/types';
class Lambda {
@parser({ schema: orderSchema, envelope: SqsEnvelope, safeParse: true })
async handler(event: ParsedResult<unknown, Order[]>, _context: Context) {
if (event.success) {
event.data.forEach(order => console.log(order.id));
return { statusCode: 200 };
} else {
console.error(event.error.message);
return { statusCode: 400, body: 'Invalid event' };
}
}
}const lambdaHandler = async (event: ParsedResult<unknown, Order>) => {
if (event.success) {
console.log(event.data.orderId);
return { statusCode: 200 };
} else {
return { statusCode: 400, body: JSON.stringify({ error: 'Invalid format' }) };
}
};
export const handler = middy(lambdaHandler).use(
parser({ schema: orderSchema, envelope: EventBridgeEnvelope, safeParse: true })
);Extract validation details from ZodError:
import { parse, ParseError } from '@aws-lambda-powertools/parser';
import { ZodError } from 'zod';
const result = parse(event, SqsEnvelope, orderSchema, true);
if (!result.success) {
if (result.error instanceof ParseError && result.error.cause instanceof ZodError) {
const zodError = result.error.cause;
zodError.issues.forEach(issue => {
console.error(`${issue.path.join('.')}: ${issue.message}`);
});
await sendToDeadLetterQueue(result.originalEvent, zodError.issues);
}
}Process records individually:
import { parse } from '@aws-lambda-powertools/parser';
import { SqsSchema } from '@aws-lambda-powertools/parser/schemas';
import { JSONStringified } from '@aws-lambda-powertools/parser/helpers';
const sqsEvent = parse(event, undefined, SqsSchema);
const results = { succeeded: [], failed: [] };
for (const record of sqsEvent.Records) {
const result = JSONStringified(orderSchema).safeParse(record.body);
if (result.success) {
console.log('Processing:', result.data.id);
results.succeeded.push(record.messageId);
} else {
console.error('Failed:', record.messageId, result.error.message);
results.failed.push({ messageId: record.messageId, error: result.error.message });
}
}
// Return failed IDs for SQS partial batch failure
if (results.failed.length > 0) {
return {
batchItemFailures: results.failed.map(f => ({ itemIdentifier: f.messageId }))
};
}safeParse: true for untrusted dataoriginalEvent for debugginginstanceof ParseError to distinguish errorserror.cause for detailed validation errors (ZodError)