奇葩的mysql封装问题!!!
发布于 2 年前 作者 HelTi 2014 次浏览 来自 问答

本来想封装一下mysql模块来简化操作,可是在用的时候出现了问题!!!

//sqlhelper.js
var mysql = require('mysql');

class sqlHelper {
    constructor(Opt) {
        //默认配置
        this.connectOpt =Object.assign(Opt);
        this.connection = mysql.createConnection(this.connectOpt);
        this.result=null;
    }

    query(str) {
        this.connection.connect();
        this.connection.query(str, (error, results, fields) => {
            if (error) throw error;
           console.log(results)
           return results;
        })
    }
}
module.exports = sqlHelper;

sqlr.png 结果是,类中是可以打印结果的,但是想得到数据的时候却返回了undefined!!!,我滴个擦,难道是异步的问题??? sqlm.png 求大佬解答怎么 才可以取到查询结果!

16 回复

我里个擦 query 必须有callback 才能得到results,不能用reutrn

@blackjack 一语惊醒梦中人啊,大佬,到时我想应该可以返回吧。。如果只用callback那没意义啊,我就想拿到返回值,不想让他为undefined

既然都上class了,直接async/await 撒

。。。 。。。 异步函数,不用callback,想把结果return回去,是不可能的,因为你数据库查询还没有完毕呢,就直接走到return results;了,然后你得results肯定就是undefined吖,,,
不用callback的话,你可以试一下Promise呢。

@CRAZYFAKE 大佬说具体点,么么哒

@imhered 大佬怎么写,问题是这个mysql就是用的callback

仅供参考,不敢保证完全正确!!!

callback写法的话 ,应该是这样的

//sqlhelper.js
var mysql = require('mysql');

class sqlHelper {
    constructor(Opt) {
        //默认配置
        this.connectOpt =Object.assign(Opt);
        this.connection = mysql.createConnection(this.connectOpt);
        this.result=null;
    }

    query(str, cb) {
        this.connection.connect();
        this.connection.query(str, (error, results, fields) => {
            if (error) return cb(error);
           console.log(results)
           cb(error,results);
        })
    }
}
module.exports = sqlHelper;

// 调用
import SqlHelper from './sqlHelper';
let sqlHelper =new SqlHelper();
sqlHelper.query(sql,(error,results)=>{
	// 先处理错误
    // ...
})

async/await 写法

//sqlhelper.js
var mysql = require('mysql');

class sqlHelper {
    constructor(Opt) {
        //默认配置
        this.connectOpt =Object.assign(Opt);
        this.connection = mysql.createConnection(this.connectOpt);
        this.result=null;
    }
   
    query(str) {
        this.connection.connect();
        return new Promise((resolve, reject)=>{
           // 这里用this 应该不行,但是我忘了class里应该怎么处理
           this.connection.query(str, (error, results, fields) => {
                if (error) reject(error);
                else resolve(results);
            }) 
        })
        
    }
}
module.exports = sqlHelper;

// 调用
import SqlHelper from './sqlHelper';
let sqlHelper =new SqlHelper();

// 一定要在async函数里
let result = await sqlHelper.query(sql);

@imhered 第一种callback可以实现,第二种async/await 报错,深深的体会到了nodejs所谓的回调地狱。。 第一种callback我完善了下


  query(str, cb) {
        this.connection.connect();
        this.connection.query(str, (error, results, fields) => {
            if (error) throw error;
            cb.call(null, error, results, fields)
            console.log(results)
            /*  this.connection.end();*/
        })
    }

@HelTi async/await 有node版本要求的,具体多少我忘了。 还有就是调用 await必须是要在async函数内才行

@imhered node7.6

来自酷炫的 CNodeMD

@HelTi 目前没有电脑,明天给你发一个版本吧😄

@HelTi 第二种肯定是不行的。。因为async/wait要结合使用

async function insertData(person){
    let db, collection, result; 
    try{
        db = await mongoDb.open();
        collection = await db.collection("users");
        result = await collection.insert(person);
    }catch(e){
        console.error(e.message);
    }
} 

@CRAZYFAKE 好的,么么哒

@HelTi 第二个版本应该是这样的。

//sqlhelper.js
var mysql = require('mysql');

class SqlHelper {
    constructor(Opt) {
        //默认配置
        // this.connectOpt = Object.assign(Opt);
        // this.connection = mysql.createConnection(this.connectOpt);
        // this.result = null;
    }

    query(str) {
        // this.connection.connect();
        return new Promise((resolve, reject) => {
            // 这里处理你的查询
            resolve({
                success: true
            });
        })

    }
}
// module.exports = sqlHelper;

// 调用
// import SqlHelper from './sqlHelper';
let sqlHelper = new SqlHelper({});


// 一定要在async函数里
(async function() {
    let result = await sqlHelper.query('');
    console.log(result)
})()

@CRAZYFAKE 我用的node版本为6.11.0长期稳定支持版。 无法使用async/await。最新的8.1.2可以使用。。但是用了最新的node版本,项目依赖的模块会报错,这个就坑了!!所以最终选择了用callback来解决

@HelTi 恩。async/await需要7.0版本以上的。用callback的话也是可以的~

回到顶部