Comfy-Org / Comfy-Org/ComfyUI-Manager

Bug: KeyError 'mode' in fetch_customnode_list when query parameter is missing

Open
#2,740 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
16.1k
Forks
2.5k
Avg merge
5d 4h
Merged PRs (30d)
13

Description

## Description

The `/customnode/getlist` endpoint crashes with a `KeyError` when the `mode` query parameter is not provided in the request. The handler at `glob/manager_server.py:877` accesses `request.rel_url.query["mode"]` directly without a default value, while the `skip_update` parameter on line 872 correctly uses `.get()`.

## Steps to Reproduce

1. Send a GET request to `/customnode/getlist` without the `mode` query parameter
2. The server throws a `KeyError: 'mode'`

## Error Traceback

```
Error handling request from 127.0.0.1
Traceback (most recent call last):
File ".../aiohttp/web_protocol.py", line 510, in _handle_request
resp = await request_handler(request)
File ".../aiohttp/web_app.py", line 569, in _handle
return await handler(request)
...
File ".../ComfyUI-Manager/glob/manager_server.py", line 877, in fetch_customnode_list
if request.rel_url.query["mode"] == "local":
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
KeyError: 'mode'
```

## Root Cause

In `glob/manager_server.py`, the `fetch_customnode_list` handler uses direct dictionary access `request.rel_url.query["mode"]` on lines 877, 882, and 883, which raises `KeyError` if `mode` is not present.

Note that `skip_update` on line 872 already uses the safe `.get()` pattern:
```python
if request.rel_url.query.get("skip_update", '').lower() == "true": # ✅ safe
```

But `mode` does not:
```python
if request.rel_url.query["mode"] == "local": # ❌ KeyError if missing
```

## Suggested Fix

Use `request.rel_url.query.get("mode", "default")` (or an appropriate default value) instead of direct dictionary access on lines 877, 882, and 883. For example:

```python
mode = request.rel_url.query.get("mode", "cache")

if mode == "local":
channel = 'local'
else:
channel = core.get_config()['channel_url']

node_packs = await core.get_unified_total_nodes(channel, mode, 'cache')
json_obj_github = core.get_data_by_mode(mode, 'github-stats.json', 'default')
json_obj_extras = core.get_data_by_mode(mode, 'extras.json', 'default')
```

## Environment

- ComfyUI-Manager version: 3.39.3
- ComfyUI version: latest master
- Python: 3.12
- OS: macOS

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.