fix(order-service): 修复包含 Emoji 和孤立代理字符的订单在 PostgreSQL jsonb 下报错导致死循环重试进单的问题
1. 在 utils/json.ts 新增 sanitizeWellFormedUnicode、deepSanitizeUnicode 和 safeJsonStringify,自动清理空字节 (\0) 并将畸变孤立 UTF-16 代理字符 (Lone Surrogates) 安全转换为规范字符,杜绝 PostgreSQL jsonb 解析错误; 2. 拼多多订单映射器与通用进单服务 (order-service) 全面接入 Unicode 深度清洗与安全序列化,确保买家昵称/留言中的各类特殊 Emoji 和生僻字符平滑落库; 3. 数据库仓储层 (order-repo / order-item-repo) 针对 raw_payload_json、spec_json、item_snapshot_json 等 jsonb 字段增加兜底安全序列化保护; 4. 补充 utils/json.test.ts 与 pdd-order-mapper.test.ts 单元测试,覆盖畸变字符与空字节场景。
This commit is contained in:
@@ -19,6 +19,7 @@ import {
|
||||
import { nowIso } from '../../utils/time.js'
|
||||
import { logDebug, logInfo, logIntegration, logWarn } from '../../utils/logger.js'
|
||||
import { createHttpError } from '../../utils/http.js'
|
||||
import { safeJsonStringify, sanitizeWellFormedUnicode } from '../../utils/json.js'
|
||||
import type { OrderItemRow, OrderRow, TaskRow } from '../../types/repository/rows.js'
|
||||
|
||||
type SourceOrderItem = {
|
||||
@@ -138,12 +139,12 @@ export async function upsertOrderFromSource(
|
||||
platformOrderId: event.platformOrderId,
|
||||
orderStatus: event.orderStatus,
|
||||
payStatus: event.payStatus,
|
||||
buyerId: event.buyerId,
|
||||
buyerName: event.buyerName,
|
||||
receiverContact: event.receiverContact,
|
||||
buyerId: sanitizeWellFormedUnicode(event.buyerId),
|
||||
buyerName: sanitizeWellFormedUnicode(event.buyerName),
|
||||
receiverContact: sanitizeWellFormedUnicode(event.receiverContact),
|
||||
totalAmount: event.totalAmount,
|
||||
currency: event.currency,
|
||||
rawPayloadJson: JSON.stringify(event.rawPayload),
|
||||
rawPayloadJson: safeJsonStringify(event.rawPayload),
|
||||
...(event.paidAt !== undefined ? { paidAt: event.paidAt } : {}),
|
||||
}
|
||||
const mergedPayload = mergeSourceOrderState(existing, basePayload)
|
||||
@@ -172,11 +173,11 @@ export async function upsertOrderFromSource(
|
||||
executor,
|
||||
order.id,
|
||||
resolvedFulfillmentItems.map((item) => ({
|
||||
skuCode: item.skuCode,
|
||||
skuName: item.skuName,
|
||||
skuCode: sanitizeWellFormedUnicode(item.skuCode),
|
||||
skuName: sanitizeWellFormedUnicode(item.skuName),
|
||||
quantity: item.quantity,
|
||||
specJson: JSON.stringify(item.spec || {}),
|
||||
itemSnapshotJson: JSON.stringify(item.snapshot || item.spec || {}),
|
||||
specJson: safeJsonStringify(item.spec || {}),
|
||||
itemSnapshotJson: safeJsonStringify(item.snapshot || item.spec || {}),
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
})),
|
||||
|
||||
Reference in New Issue
Block a user