Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs异步/等待mysql查询_Javascript_Mysql_Node.js_Async Await - Fatal编程技术网

Javascript Nodejs异步/等待mysql查询

Javascript Nodejs异步/等待mysql查询,javascript,mysql,node.js,async-await,Javascript,Mysql,Node.js,Async Await,我有一个nodejs项目,当前结构如下,我需要在clients表上插入一个注册表,并从该表返回最后一个插入的ID,这样我就可以在第二个表中使用它,但我需要等到clients表中的插入完成后,才能在第二个表中插入客户ID。我尝试使用async/await,但总是得到一个空值 我的MYSQL连接:db.model.js const config = require('config'); const mysql = require("mysql"); const connection = mysql

我有一个nodejs项目,当前结构如下,我需要在clients表上插入一个注册表,并从该表返回最后一个插入的ID,这样我就可以在第二个表中使用它,但我需要等到clients表中的插入完成后,才能在第二个表中插入客户ID。我尝试使用async/await,但总是得到一个空值

我的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;
这是客户机控制器(我在这里尝试使用async/Wait)

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


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

文件来创建数据库连接

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

所以我仍然只使用npm-mysql包,但现在我将所有查询转换为下面的承诺,所以我可以等待所有查询完成

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);
        });
    });
};
然后我用这个:

create(params)
       .then((result) => { 
           //call more queries here if needed 
       })
       .catch((err) => { });

所以我仍然只使用npm-mysql包,但现在我将所有查询转换为下面的承诺,所以我可以等待所有查询完成

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);
        });
    });
};
然后我用这个:

create(params)
       .then((result) => { 
           //call more queries here if needed 
       })
       .catch((err) => { });

您可以使用“mysql2”来使用promisified方法。您可以使用“mysql2”来使用promisified方法。