jlcodes99/cockpit-tools · warning
[ExternalImport][App] payload 归一化失败,已忽略
Error message
[ExternalImport][App] payload 归一化失败,已忽略
What it means
handleExternalProviderImportRawPayload logs the raw external import payload and passes it through normalizeExternalProviderImportPayload. If normalization returns null/undefined the payload does not conform to the expected external import schema (missing or wrongly-typed fields such as providerId), so the app logs this warning and drops the payload without importing.
Source
Thrown at src/App.tsx:973
variant: 'secondary',
},
],
});
console.warn('[ExternalImport][App] 当前版本不支持外部导入方式,已终止导入', {
currentVersion: currentVersion || null,
requiredVersion,
providerId: payload.providerId,
});
return false;
},
[showModal, t],
);
const handleExternalProviderImportRawPayload = useCallback(async (rawPayload: unknown) => {
console.info('[ExternalImport][App] 收到原始 payload:', rawPayload);
const normalized = normalizeExternalProviderImportPayload(rawPayload);
if (!normalized) {
console.warn('[ExternalImport][App] payload 归一化失败,已忽略');
return;
}
if (!(await ensureExternalImportVersionCompatible(normalized))) {
return;
}
const now = Date.now();
for (const [key, handledAt] of externalImportHandledAtRef.current) {
if (now - handledAt > EXTERNAL_IMPORT_DEDUPE_WINDOW_MS) {
externalImportHandledAtRef.current.delete(key);
}
}
const dedupeKey = buildExternalImportDedupeKey(normalized);
if (externalImportHandledAtRef.current.has(dedupeKey)) {
console.info('[ExternalImport][App] 重复外部导入 payload 已忽略');
return;
}
externalImportHandledAtRef.current.set(dedupeKey, now);
console.info('[ExternalImport][App] payload 归一化成功:', {View on GitHub (pinned to 1ed8b77992)
Solutions
- Check the logged '[ExternalImport][App] 收到原始 payload:' line immediately above to see which field failed the schema.
- Regenerate the import payload from a valid export rather than editing it by hand.
- Validate the payload against the external import schema before sharing (all required fields present, correct types).
- If it comes from another tool, confirm the payload matches this app's external import format/version.
Example fix
// before
console.info('[ExternalImport][App] 收到原始 payload:', rawPayload);
const normalized = normalizeExternalProviderImportPayload(rawPayload);
if (!normalized) {
console.warn('[ExternalImport][App] payload 归一化失败,已忽略');
return;
}
// after
const parsed = ExternalProviderImportPayloadSchema.safeParse(rawPayload);
if (!parsed.success) {
console.warn('[ExternalImport][App] payload 归一化失败:', parsed.error.issues);
return;
}
const normalized = normalizeExternalProviderImportPayload(parsed.data); Defensive patterns
Strategy: type-guard
Validate before calling
function isValidExternalImportPayload(p: unknown): boolean {
if (typeof p !== 'object' || p === null) return false;
const o = p as Record<string, unknown>;
return typeof o.providerId === 'string' && o.providerId.length > 0 &&
typeof o.requiredVersion === 'string';
}
if (!isValidExternalImportPayload(rawPayload)) return;
Type guard
function isExternalImportPayload(v: unknown): v is ExternalProviderImportPayload {
return (
typeof v === 'object' && v !== null &&
typeof (v as any).providerId === 'string' &&
typeof (v as any).config === 'object'
);
}
Try / catch
let rawPayload: unknown;
try {
rawPayload = JSON.parse(payloadSource);
} catch {
console.warn('[ExternalImport][App] payload JSON 解析失败');
return;
}
const normalized = normalizeExternalProviderImportPayload(rawPayload);
if (!normalized) {
console.warn('[ExternalImport][App] payload 归一化失败,已忽略');
return;
} Prevention
- Validate payloads with a schema library (zod) at the boundary before normalization
- Log which field failed normalization to speed up diagnosis
- Regenerate import payloads from the export feature instead of hand-editing
- Round-trip test exports/imports when changing the payload schema
When it happens
Trigger: Receiving a raw payload (deep link, clipboard, file drop) whose shape fails validation: missing providerId, wrong types for nested fields, malformed JSON that was partially parsed, or an unknown schema version.
Common situations: Hand-edited or truncated shared import files, exports from incompatible third-party tools, copy/paste losing part of the payload, or URL encoding mangling fields.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
AI-assisted analysis of jlcodes99/cockpit-tools@1ed8b77992 (2026-09-05).
Data as JSON: /api/errors/c35979619ddbbb64.
Report an issue: GitHub.