我有一个下面的当前结构的nodejs项目,我需要在客户表上插入一个注册表,并从该表返回最后插入的ID,以便可以在第二个表中使用它,但是我需要等到插入完成后才能在其中进行操作。客户端表,然后在第二个表中插入客户端ID。我正在尝试使用异步/等待,但是我总是得到一个空值。

我的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;


我的客户模型

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;


这是客户端控制器(我在这里尝试使用异步/等待)

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;
        }
    });
}


这是另一个控制器,我想在其中使用客户端控制器中的方法:


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))



任何帮助表示赞赏。

最佳答案

文件创建数据库连接

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;


使用连接执行本地查询

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

let query = 'select * from users';
let conn = await dl.getDBConnection();
let [data, fields] = await conn.query(query);

10-05 20:36
查看更多