TypeScript: код не продолжается после ожидания запроса от postgres - PullRequest
0 голосов
/ 14 апреля 2020

Что написано на банке. Всякий раз, когда мой код встречает ожидание, он фактически останавливается, если после него не будет запущено другое ожидание. Рассмотрим мой код ниже:

dbManagerPg.ts:

import {Client, QueryResult} from 'pg';
export default class PgDatabase {
    private client: Client;
    private connected = false;    
    private async checkConnection() {
        if (this.connected) return;
        try {
            this.client = new Client({ ssl: false });
            await this.client.connect();
            this.connected = true;
        } catch (e) {
            this.connected = false;
            throw new Error('Could not connect to database!');
        }
    }    
    public async query(str: string): Promise<QueryResult> {
        await this.checkConnection();
        return this.client.query(str);
    }
}

dataManager.ts:

import PgDatabase from './dbManagerPg';
public async saveBoard(pBoard: Board, roomId: string) {
    const boardTransformData = {transform: {local: {x: pBoard.x, y: pBoard.y, z: pBoard.z}}};
    const sql = pgescape(`INSERT INTO boards(room_id, board_location) VALUES(%L, %L) RETURNING id;`, roomId, JSON.stringify(boardTransformData));
    const pgDbQuery = await this.pgdb.query(sql);
    return pgDbQuery;
}
public async saveBoardObjs(pBoardObj: BoardObjData[], boardId: number) {
    let sql = `INSERT INTO notes(board_id, note_type, note_location, note_property, text, meta) VALUES `;
    for (let i = 0; i < pBoardObj.length; i++) {
        const notLoc = {x: pBoardObj[i].position.x, y: pBoardObj[i].position.y, z: pBoardObj[i].position.z};
        const text = pBoardObj[i].text || null;
        const prop = pBoardObj[i].noteProperty || 'BLUE';
        sql += `(${boardId}, ${pBoardObj[i].type}, \'${JSON.stringify(notLoc)}\', \'${prop}\', \'${text}\', ${null})`;
        sql += ((i < pBoardObj.length - 1) ? `, ` : ``);
    }
    sql += ` RETURNING id;`;
    const pgDbQuery = await this.pgdb.query(sql);
    return pgDbQuery;
}

А вот код, который вызывает saveBoard и saveBoardObjs :

const board = await this.dataManager.saveBoard(this.board, this.spaceId);
this.board.dbId = board.rows[0].id;

const currentBoardObjs = this.getBoardObjectData(this.board);
if (this.loadedBoardObjIds.length === 0 && currentBoardObjs.length > 0) {
    const notes = await this.dataManager.saveBoardObjs(currentBoardObjs, this.board.dbId);
    for (const data of notes.rows) {
        this.loadedBoardObjIds.push(data.id);
    }
}

Функции saveBoard и saveBoardObjs запускаются одна за другой. Полученные журналы от saveBoard (console.log результат) отображаются нормально. Но те из последней функции, saveBoardObjs, вообще не отображаются, по крайней мере, пока не будет выполнена другая операция. Существуют и другие операции с базами данных, которые я не использовал здесь ради длины, но все они имеют одну и ту же проблему.

Это раздражает, так как я не знаю, является ли результат ошибкой или нет; Я должен перезапустить приложение (оно тянет из БД при запуске) и, как ни странно, результатом является ошибка, но довольно бесполезная:

QUERY: INSERT INTO notes(board_id, note_type, note_location, note_property, text, meta) VALUES (1, 0, '{"x":1.040993487536785,"y":0.3669705562337149,"z":-0.05}', 'BLUE', 'blue', null), (1, 1, '{"x":-1.0042251322371651,"y":-1.1320326846033155,"z":-0.05}', 'BLUE', 'yellow', null) RETURNING id;
unhandledRejection Connection closed.

Чего-то не хватает в моем коде? На данный момент приложение довольно простое, но я могу себе представить, что это станет еще хуже, если будет накапливаться больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...