104 lines
3.1 KiB
Markdown
104 lines
3.1 KiB
Markdown
|
|
# Исправление ошибки в Code1: mapDialogHistory
|
|||
|
|
|
|||
|
|
## Проблема
|
|||
|
|
|
|||
|
|
**Ошибка:**
|
|||
|
|
```
|
|||
|
|
Cannot read properties of null (reading 'map') [line 69]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Причина:**
|
|||
|
|
Функция `mapDialogHistory` получает `null` вместо массива, когда `src.dialog_history` равен `null`.
|
|||
|
|
|
|||
|
|
## Исправление
|
|||
|
|
|
|||
|
|
### Текущий код (строка 69):
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
function mapDialogHistory(h = []) {
|
|||
|
|
return h.map(m => ({
|
|||
|
|
id: toNullish(m.id),
|
|||
|
|
role: toNullish(m.role),
|
|||
|
|
message: toNullish(m.message),
|
|||
|
|
message_type: toNullish(m.message_type),
|
|||
|
|
tg_message_id: toNullish(m.tg_message_id),
|
|||
|
|
created_at: toNullish(m.created_at),
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Исправленный код:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
function mapDialogHistory(h = []) {
|
|||
|
|
// Проверяем, что h не null и является массивом
|
|||
|
|
if (!h || !Array.isArray(h)) return [];
|
|||
|
|
return h.map(m => ({
|
|||
|
|
id: toNullish(m.id),
|
|||
|
|
role: toNullish(m.role),
|
|||
|
|
message: toNullish(m.message),
|
|||
|
|
message_type: toNullish(m.message_type),
|
|||
|
|
tg_message_id: toNullish(m.tg_message_id),
|
|||
|
|
created_at: toNullish(m.created_at),
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Альтернативное решение
|
|||
|
|
|
|||
|
|
Можно также исправить в месте вызова:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// В функции normalizeOne, строка ~172
|
|||
|
|
dialog_history: mapDialogHistory(src.dialog_history || []),
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Но лучше исправить саму функцию, чтобы она была более устойчивой.
|
|||
|
|
|
|||
|
|
## Полный исправленный код функции mapDialogHistory
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
function mapDialogHistory(h = []) {
|
|||
|
|
// Проверяем, что h не null и является массивом
|
|||
|
|
if (!h || !Array.isArray(h)) return [];
|
|||
|
|
return h.map(m => ({
|
|||
|
|
id: toNullish(m.id),
|
|||
|
|
role: toNullish(m.role),
|
|||
|
|
message: toNullish(m.message),
|
|||
|
|
message_type: toNullish(m.message_type),
|
|||
|
|
tg_message_id: toNullish(m.tg_message_id),
|
|||
|
|
created_at: toNullish(m.created_at),
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Почему это происходит
|
|||
|
|
|
|||
|
|
Когда SQL запрос в ноде `give_data1` возвращает `null` для `dialog_history` (если нет записей в `clpr_dialog_history_tg`), функция `mapDialogHistory` получает `null` вместо массива.
|
|||
|
|
|
|||
|
|
PostgreSQL `jsonb_agg` возвращает `null`, если нет строк для агрегации, а не пустой массив `[]`.
|
|||
|
|
|
|||
|
|
## Дополнительные проверки
|
|||
|
|
|
|||
|
|
Можно также добавить проверки для других функций, которые работают с массивами:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
function mapDocuments(docs = []) {
|
|||
|
|
if (!docs || !Array.isArray(docs)) return [];
|
|||
|
|
return docs.map(d => ({...}));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function mapVisionDocs(vds = []) {
|
|||
|
|
if (!vds || !Array.isArray(vds)) return [];
|
|||
|
|
return vds.map(v => ({...}));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function mapCombinedDocs(cds = []) {
|
|||
|
|
if (!cds || !Array.isArray(cds)) return [];
|
|||
|
|
return cds.map(c => ({...}));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Но для `mapDialogHistory` это критично, т.к. она вызывается первой и падает.
|
|||
|
|
|