migrating-nango-deletion-detection

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Migrating Nango Deletion Detection

迁移Nango删除检测功能

Do this

操作步骤

  1. Find legacy usage:
    • deleteRecordsFromPreviousExecutions(
    • trackDeletes:
      /
      track_deletes
  2. For each sync + model that needs automatic deletion detection:
    • Add
      await nango.trackDeletesStart('ModelName')
      at the start of
      exec
      (before fetching/saving).
    • Replace
      await nango.deleteRecordsFromPreviousExecutions('ModelName')
      with
      await nango.trackDeletesEnd('ModelName')
      .
    • Keep
      trackDeletesEnd
      after all
      batchSave
      /
      batchUpdate
      /
      batchDelete
      calls.
  3. Safety:
    • Only call
      trackDeletesEnd
      if the full dataset was fetched + saved between
      trackDeletesStart
      and
      trackDeletesEnd
      (otherwise you can cause false deletions).
    • Prefer letting exceptions bubble. If you
      catch
      , re-throw when data is incomplete.
  1. 查找旧版用法:
    • deleteRecordsFromPreviousExecutions(
    • trackDeletes:
      /
      track_deletes
  2. 对每个需要自动删除检测的同步任务+模型:
    • exec
      函数开头(获取/保存数据前)添加
      await nango.trackDeletesStart('ModelName')
    • await nango.deleteRecordsFromPreviousExecutions('ModelName')
      替换为
      await nango.trackDeletesEnd('ModelName')
    • 确保
      trackDeletesEnd
      在所有
      batchSave
      /
      batchUpdate
      /
      batchDelete
      调用之后执行。
  3. 注意事项:
    • 仅当在
      trackDeletesStart
      trackDeletesEnd
      之间已完整获取并保存全部数据集时,才调用
      trackDeletesEnd
      (否则可能导致误删)。
    • 建议让异常自然抛出。如果使用
      catch
      捕获异常,当数据不完整时请重新抛出。

Checkpointed full refresh (multi-execution)

基于检查点的全量刷新(多执行实例)

  • Call
    trackDeletesStart('ModelName')
    at the beginning of each execution in the refresh window (it is safe/idempotent while the window is open).
  • Call
    trackDeletesEnd('ModelName')
    only in the execution that finishes saving the full dataset.
  • 在刷新窗口内的每个执行实例开始时调用
    trackDeletesStart('ModelName')
    (在窗口开启期间调用是安全且幂等的)。
  • 仅在完成全量数据集保存的那个执行实例中调用
    trackDeletesEnd('ModelName')

Tests

测试

  • Re-record mocks after code changes:
    • nango dryrun <sync-name> <connection-id> --validate -e dev --no-interactive --auto-confirm
    • nango dryrun <sync-name> <connection-id> --save -e dev --no-interactive --auto-confirm
    • nango generate:tests && npm test
  • Never hand-edit
    *.test.json
    .
  • 代码变更后重新录制模拟数据:
    • nango dryrun <sync-name> <connection-id> --validate -e dev --no-interactive --auto-confirm
    • nango dryrun <sync-name> <connection-id> --save -e dev --no-interactive --auto-confirm
    • nango generate:tests && npm test
  • 请勿手动编辑
    *.test.json
    文件。

Before/after

前后对比

ts
// Before
for await (const page of nango.paginate(cfg)) {
    await nango.batchSave(page, 'Ticket');
}
await nango.deleteRecordsFromPreviousExecutions('Ticket');
ts
// After
await nango.trackDeletesStart('Ticket');

for await (const page of nango.paginate(cfg)) {
    await nango.batchSave(page, 'Ticket');
}

await nango.trackDeletesEnd('Ticket');
ts
// 旧版代码
for await (const page of nango.paginate(cfg)) {
    await nango.batchSave(page, 'Ticket');
}
await nango.deleteRecordsFromPreviousExecutions('Ticket');
ts
// 新版代码
await nango.trackDeletesStart('Ticket');

for await (const page of nango.paginate(cfg)) {
    await nango.batchSave(page, 'Ticket');
}

await nango.trackDeletesEnd('Ticket');