Что написано на банке. Всякий раз, когда мой код встречает ожидание, он фактически останавливается, если после него не будет запущено другое ожидание. Рассмотрим мой код ниже:
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.
Чего-то не хватает в моем коде? На данный момент приложение довольно простое, но я могу себе представить, что это станет еще хуже, если будет накапливаться больше кода.