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
- Re-fetch getConfigList(type) and use a fresh _id before updating
- Verify the `type` argument matches the type the config id belongs to
- Refresh the settings UI so it edits an existing entry rather than a stale snapshot
- 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
- Re-fetch the config list immediately before updates; never cache _id across sessions
- Verify the type argument matches the config's owner type
- Handle concurrent deletion (refresh UI state when another window changes configs)
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
- TIPS_UPLOADER_CONFIG_CANNOT_DELETE_LAST
- TIPS_UPLOADER_CONFIG_NAME_EMPTY
- Failed to change current uploader
- Config not found
- PICGO_CLOUD_CONFIG_SYNC_LOCAL_CONFIG_INVALID
AI-assisted analysis of Molunerfinn/PicGo@07ec7068a5 (2026-08-30).
Data as JSON: /api/errors/dab81afc793302b2.
Report an issue: GitHub.