问题描述
我正在更改后端(从Mongo切换到MysqL)。我知道错误将被抛出,因为在SQL查询完成之前执行了return语句,然后当我的SQL查询完成时,发送另一个res.send
很累,因此为什么我要使用{{1} }和Promise包装器一起在我的MysqL2
函数中对查询使用await
。
我有一个单独的文件来创建数据库连接,因此我可以在整个Nodejs后端访问该连接:
async
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