Mam projekt nodejs z aktualną strukturą poniżej, muszę wstawić rejestr do tabeli klientów i zwrócić ostatni wstawiony identyfikator z tej tabeli, aby móc go użyć w drugiej tabeli, ale muszę poczekać, aż wstawianie zostanie zakończone w klientów, przed wstawieniem identyfikatora klienta do mojej drugiej tabeli. Próbuję użyć async / await, ale zawsze otrzymuję wartość null.

Połączenie My MYSQL: db.model.js

const config = require('config');
const mysql = require("mysql");

const connection = mysql.createConnection({
    host: config.get('mysql.host'),
    user: config.get('mysql.user'),
    password: config.get('mysql.password'),
    database: config.get('mysql.database')
});

connection.connect(function (err) {
    if (err) {
        console.error(`MySQL Connection Error: ${err.stack}`);
        return;
    }

    console.log(`MySQL connected successfully!`);
});

module.exports = connection;

Mój model KLIENTA

const mysql = require("./db.model");

const Client = function(client) {
    this.login = client.login;
};

Client.create = (newClient, result) => {
    mysql.query("INSERT INTO clients SET ?", newClient, 
        (err, res) => {
            if (err) {
                console.log("error: ", err);
                result(err, null);
                return;
            }

            result(null, {
                id: res.insertId,
                ...newClient
            });
        }
    );
};

module.exports = Client;

To jest kontroler klienta (próbuję tutaj użyć async / await)

const Client = require('../models/client.model');

exports.create = (login) => {
    const client = new Client({
        login: login
    });

    Client.create(client, async (err, data) => {
        if(!err) {
            return await data.id;
        } else {
            return false;
        }
    });
}

A to jest kolejny kontroler, w którym chcę użyć metod z mojego kontrolera klienta:


const ClientController = require('../controllers/client.controller');

...

    utils.connect()
        .then(clt => clt.sub.create(data))
        .then((sub) => {

            let lastInsertedId = ClientController.create(sub.login);

            // lastInsertedId always return null here, 
            // but I know ClientController return a value after some time.
            // method below will fail because lastInsertedId cannot be null
            TransactionController.transactionCreate(lastInsertedId,
                                                    sub.id, 
                                                    sub.param);
        })
        .catch(error => res.send(error.response.errors))

Każda pomoc doceniona.

1
heliosk 6 marzec 2020, 21:39

2 odpowiedzi

Najlepsza odpowiedź

Więc nadal używam tylko pakietu npm mysql, ale teraz przekształciłem wszystkie moje zapytania w obietnice, jak poniżej, więc mogę po prostu poczekać, aż wszystkie zapytania zostaną zakończone.

const create = (idCliente, transactionId, amount, status) => {

    const sql = "INSERT INTO transactions SET ?";
    const params = {
        id_cliente: idCliente,
        transaction_id: transactionId,
        amount: amount,
        status: status
    };

    return new Promise((resolve, reject) => {
        pool.query(sql, params, (err, result) => {
            if (err) {
                return reject(err);
            }
            resolve(result);
        });
    });
};

Wtedy używam w ten sposób:

create(params)
       .then((result) => { 
           //call more queries here if needed 
       })
       .catch((err) => { });
0
heliosk 26 kwiecień 2020, 21:12

Plik do utworzenia połączenia z bazą danych

const config = require('config');
const mysql = require('mysql2');
const bluebird = require('bluebird');

const dbConf = {
    host: config.dbhost,
    user: config.dbuser,
    password: config.dbpassword,
    database: config.database,
    Promise: bluebird
};

class Database {

    static async getDBConnection() {
        try {
            if (!this.db) {
                // to test if credentials are correct
                await mysql.createConnection(dbConf);
                const pool = mysql.createPool(dbConf);
                // now get a Promise wrapped instance of that pool
                const promisePool = pool.promise();
                this.db = promisePool;
            }
            return this.db;
        } catch (err) {
            console.log('Error in database connection');
            console.log(err.errro || err);
        }

    }
}

module.exports = Database;

Użyj połączenia, aby wykonać natywne zapytanie

const database = require('./database');

let query = 'select * from users';
let conn = await dl.getDBConnection();
let [data, fields] = await conn.query(query);
3
Rahul Patil 6 marzec 2020, 18:51