本来想封装一下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;
结果是,类中是可以打印结果的,但是想得到数据的时候却返回了undefined!!!,我滴个擦,难道是异步的问题??? 求大佬解答怎么 才可以取到查询结果!
我里个擦 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函数内才行
@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
的话也是可以的~