Molunerfinn/PicGo · error

TIPS_UPLOADER_CONFIG_NOT_FOUND

Error message

TIPS_UPLOADER_CONFIG_NOT_FOUND

What it means

When updating an uploader config by id, the route looks up the config in picgo.uploaderConfig.getConfigList(type) by _id. If no config with that _id exists, it throws TIPS_UPLOADER_CONFIG_NOT_FOUND. This means the target config was deleted, renamed at the storage layer, or the id was never valid for that type.

Source

Thrown at src/main/events/rpc/routes/config.ts:110

      return ok(activeConfig._id)
    } catch (e) {
      return fail(e)
    }
  })
  .add(IRPCActionType.UPDATE_UPLOADER_CONFIG, async (args) => {
    try {
      const [type, configId, config] = args as IUpdateUploaderConfigArgs
      const configName = typeof config._configName === 'string' ? config._configName : ''
      if (configId && !configName) {
        throw new Error(T('TIPS_UPLOADER_CONFIG_NAME_EMPTY'))
      }

      let oldConfigName = ''
      if (configId) {
        const configList = picgo.uploaderConfig.getConfigList(type)
        const existConfig = configList.find(item => item._id === configId)
        if (!existConfig) {
          throw new Error(T('TIPS_UPLOADER_CONFIG_NOT_FOUND'))
        }
        oldConfigName = existConfig._configName
      }

      if (oldConfigName && oldConfigName !== configName) {
        picgo.uploaderConfig.rename(type, oldConfigName, configName)
      }
      picgo.uploaderConfig.createOrUpdate(type, configName, config)
      notifyAppConfigUpdated()
      return ok(true)
    } catch (e) {
      return fail(e)
    }
  })

export {
  configRouter
}

View on GitHub (pinned to 07ec7068a5)

Solutions

  1. Re-fetch getConfigList(type) and use a fresh _id before updating
  2. Verify the `type` argument matches the type the config id belongs to
  3. Refresh the settings UI so it edits an existing entry rather than a stale snapshot
  4. If the config was deleted intentionally, recreate it instead of updating

Example fix

// before
await updateUploaderConfig('github', 'stale-id', cfg) // throws not found
// after
const list = await getUploaderConfigList('github')
const target = list.find(c => c._configName === 'my-config')
await updateUploaderConfig('github', target._id, cfg)
Defensive patterns

Strategy: validation

Validate before calling

const list = await getUploaderConfigList(type)
const exists = list.some(item => item._id === configId)
if (!exists) throw new Error(`Config ${configId} not found for type ${type}`)

Try / catch

try {
  await updateUploaderConfig(type, configId, config)
} catch (e) {
  if (e.message.includes('CONFIG_NOT_FOUND')) {
    const fresh = await getUploaderConfigList(type)
    const target = fresh.find(c => c._configName === config._configName)
    if (target) await updateUploaderConfig(type, target._id, config)
  } else throw e
}

Prevention

When it happens

Trigger: Calling UPDATE_UPLOADER_CONFIG with a configId that doesn't match any item's _id in the type's config list — stale id after deletion, wrong type argument, or id from a different uploader.

Common situations: Two windows/tabs open and one deletes the config the other is editing; app restarted and config ids regenerated by a migration; hard-coded or copied ids in scripts; passing a picBed config id to an uploader route (or vice versa).

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of Molunerfinn/PicGo@07ec7068a5 (2026-08-30). Data as JSON: /api/errors/dab81afc793302b2. Report an issue: GitHub.