使用mysql2 async / await时,“在将标头发送到客户端后无法设置标头”错误

问题描述

我正在更改后端(从Mongo切换到MysqL)。我知道错误将被抛出,因为在SQL查询完成之前执行了return语句,然后当我的SQL查询完成时,发送另一个res.send很累,因此为什么我要使用{{1} }和Promise包装器一起在我的MysqL2函数中对查询使用await

我有一个单独的文件来创建数据库连接,因此我可以在整个Nodejs后端访问该连接:

async

然后,创建一个在async / await之后的查询

const MysqL = require('MysqL2');

async function pool(){
    const pool = await MysqL.createPool({
        host: "ip",user: "username",password: "password",database: "db"
    });
    return pool
}

exports.getConnection = async function(callback) {
    const currentPool = await pool();
    currentPool.getConnection(function(err,conn) {
        if(err) return callback(err);
        callback(err,conn)
    });
};

我也尝试在查询中使用sql.getConnection(async function(err,client){ client.query(`select email from users where email = "${email}"`,function (error,result){ if(error) return res.status(500).send('an internal db error occurred'); // carry on with code ... }); });

await

我想念什么?我还不厌倦使用常规的await sql.getConnection(async function(err,result){ if(error) return res.status(500).send('an internal db error occurred'); // carry on with code ... }); }); NPM库并制作自己的诺言包装器...

代码

我已经更新了功能

MysqL

然后我通过以下方式调用它:

const MysqL = require('MysqL2');

const pool = MysqL.createPool({
    host: "ip",user: "user",password: "pass",database: "db"
});

exports.db = (sql) => {
    new Promise((resolve,reject) => {
        pool.getConnection((err,conn) => {
            if(err) return reject(err);

            conn.query(sql,(err,results,fields) => {
                conn.release()
                if(err) return reject(err)
                console.log(results)
                resolve(results);
            });
        });
    });
}

但是,我的代码仍然继续,保留了try{ const emailExisit = await sql.db(`SELECT email FROM users WHERE email = "${email}"`); console.log(emailExisit); if(emailExisit.length > 0) return res.status(422).send({"data": "","code": "105","message": "An account with given email already exists"}); }catch (err) { console.log(err) return res.status(500).send({"data": "","code": "108","message": `There seems to be an error contacting the database. Try again later <br> ${err}`}); } 变量emailExists(是的,它位于undefined内)

解决方法

这是我将MySQL与Node.js结合使用的配置。希望它对您有用。

.profile

/config/mysql.js

const mysql = require('mysql2'); const pool = mysql.createPool({ host: process.env.MYSQL_HOST,user: process.env.MYSQL_USER,password: process.env.MYSQL_PASSWORD,port: process.env.MYSQL_PORT,database: process.env.MYSQL_DB_NAME,}); const query = (query,args = []) => new Promise((resolve,reject) => { pool.getConnection((err,connection) => { if (err) { return reject(err); } connection.query(query,args,(err,results) => { connection.release(); if (err) { return reject(err); } resolve(results); }); }); }); module.exports = { query };

/index.js