Nodejs & TypeORM Путаница транзакций - PullRequest
0 голосов
/ 19 октября 2019

У меня путаница, и я не могу разрешить ее из документов TypeORM.

Вот моя функция, которая используется в качестве обработчика запросов и использует транзакцию, взятую из getManager ()

static makeTransaction = async (req: Request, res: Response) => {
    try {
        // check if the account ids are same
        const { senderAccountId, receiverAccountId, amount } = req.body;

        let senderAccount = await findEntityById(getRepository(Account), senderAccountId);
        let receiverAccount = await findEntityById(getRepository(Account), receiverAccountId);
        senderAccount.balance -= amount;
        receiverAccount.balance += amount;
        await validateOrReject(senderAccount);
        await validateOrReject(receiverAccount);
        const tempEntity = MyEntity.create({
            amount,
            receiverAccount: receiverAccount,
            senderAccount: senderAccount,
        });

        await validateOrReject(tempEntity);

        const accounts = await getManager().transaction(async transactionManager => {
            await transactionManager.save(senderAccount);
            await transactionManager.save(receiverAccount);

            return transactionManager.save(tempEntity);
        });

        return res.status(200).json({
            error: null,
            data: true,
        });
    } catch (e) {
        return res.status(400).json({ error: "Transaction wasn't successfull" });
    }
};

Поэтому, когда я помещаю функцию catch для последнего сохранения (только она завершается неудачнои первые 2 из них работают правильно), он выдает ошибку «Запущен обработчик запросов. Больше не может выполнять запросы».

Когда я изменяю поток следующим образом, он работает, и я действительно удивляюсь, почему в документах есть операции сохранения для разных типов объектов, и я тоже пытаюсь это сделать,

static makeTransaction = async (req: Request, res: Response) => {
    try {
        // check if the account ids are same
        const { senderAccountId, receiverAccountId, amount } = req.body;

        let senderAccount = await findEntityById(getRepository(Account), senderAccountId);
        let receiverAccount = await findEntityById(getRepository(Account), receiverAccountId);
        senderAccount.balance -= amount;
        receiverAccount.balance += amount;
        await validateOrReject(senderAccount);
        await validateOrReject(receiverAccount);
        const tempEntity = MyEntity.create({
            amount,
            receiverAccount,
            senderAccount,
        });
        await validateOrReject(tempEntity);

        const transactionRes = await getManager().transaction(async transactionManager => {
            return transactionManager.save([tempEntity, senderAccount, receiverAccount]);
        });

        return res.status(200).json({
            error: null,
            data: transactionRes[0],
        });
    } catch (e) {
        console.log(e);
        return res.status(400).json({ error: "Transaction wasn't successfull" });
    }
};

Я хочу узнать причину этого, и любая идея или помощь приветствуются, спасибо заранее.

...