如何使用 bluebird 承诺 MySql 函数?
How to promisify a MySql function using bluebird?
前段时间我决定从 PHP 切换到节点。在我的第一个项目中,我不想使用任何 ORM,因为我认为我不需要让我的生活如此复杂地学习另一件事(目前我正在学习节点和 angular)因此我决定只使用 mysql 包。重要的是要说我有一些复杂的查询,我不想从 sctratch 中学习如何使用 9000 ORM 节点之一使它们工作,这就是我到目前为止所做的:
thing.service.js
Thing.list = function (done) {
db.query("SELECT * FROM thing...",function (err,data) {
if (err) {
done(err)
} else {
done(null,data);
}
});
};
module.exports = Thing;
thing.controler.js
Thing = require('thing.service.js');
Thing.list(function (err,data) {
if (err) {
res.status(500).send('Error D:');
} else {
res.json(data);
}
});
如何使用 bluebird 来承诺这种功能?我已经尝试过但是......我在这里寻求帮助。这是我试过的
var Thing = Promise.promisifyAll(require('./models/thing.service.js'));
Thing.list().then(function(){})
我对 promisifyAll 和 IMO 从来没有太多运气,我更喜欢手动处理我的内部检查。这是我将如何处理此问题的示例:
//ThingModule
var Promises = require('bluebird');
Things.list = function(params) {
return new Promises(function(resolve, reject) {
db.query('SELECT * FROM thing...', function(err, data) {
return (err ? reject(err) : resolve(data));
});
});
}
//usage
var thinger = require('ThingModule');
thinger.list().then(function(data) {
//do something with data
})
.error(function(err) {
console.error(err);
})
我已经这样做了,效果很好。
const connection = mysql.createConnection({.....});
global.db = Bluebird.promisifyAll(connection);
db.queryAsync("SELECT * FROM users").then(function(rows){
console.log(rows);});
您还可以创建一个触发 SQL 的函数,如下所示:-
function sqlGun(query, obj, callback) {
mySQLconnection.query(query, obj, function(err, rows, fields) {
if (err) {
console.log('Error ==>', err);
// throw err;
return (err, null);
}
console.log(query)
if (rows.length) {
return callback(null, rows);
} else {
return callback(null, [])
}
});
}
其中 mySQLconnection 是您在 mysql.createConnection({}).
之后获得的连接对象
在那之后,你可以 promisify 函数并像下面这样使用 promise :-
var promisified = Promise.promisify(sqlGun);
promisified(query, {}).then( function() {} );
前段时间我决定从 PHP 切换到节点。在我的第一个项目中,我不想使用任何 ORM,因为我认为我不需要让我的生活如此复杂地学习另一件事(目前我正在学习节点和 angular)因此我决定只使用 mysql 包。重要的是要说我有一些复杂的查询,我不想从 sctratch 中学习如何使用 9000 ORM 节点之一使它们工作,这就是我到目前为止所做的:
thing.service.js
Thing.list = function (done) {
db.query("SELECT * FROM thing...",function (err,data) {
if (err) {
done(err)
} else {
done(null,data);
}
});
};
module.exports = Thing;
thing.controler.js
Thing = require('thing.service.js');
Thing.list(function (err,data) {
if (err) {
res.status(500).send('Error D:');
} else {
res.json(data);
}
});
如何使用 bluebird 来承诺这种功能?我已经尝试过但是......我在这里寻求帮助。这是我试过的
var Thing = Promise.promisifyAll(require('./models/thing.service.js'));
Thing.list().then(function(){})
我对 promisifyAll 和 IMO 从来没有太多运气,我更喜欢手动处理我的内部检查。这是我将如何处理此问题的示例:
//ThingModule
var Promises = require('bluebird');
Things.list = function(params) {
return new Promises(function(resolve, reject) {
db.query('SELECT * FROM thing...', function(err, data) {
return (err ? reject(err) : resolve(data));
});
});
}
//usage
var thinger = require('ThingModule');
thinger.list().then(function(data) {
//do something with data
})
.error(function(err) {
console.error(err);
})
我已经这样做了,效果很好。
const connection = mysql.createConnection({.....});
global.db = Bluebird.promisifyAll(connection);
db.queryAsync("SELECT * FROM users").then(function(rows){
console.log(rows);});
您还可以创建一个触发 SQL 的函数,如下所示:-
function sqlGun(query, obj, callback) {
mySQLconnection.query(query, obj, function(err, rows, fields) {
if (err) {
console.log('Error ==>', err);
// throw err;
return (err, null);
}
console.log(query)
if (rows.length) {
return callback(null, rows);
} else {
return callback(null, [])
}
});
}
其中 mySQLconnection 是您在 mysql.createConnection({}).
之后获得的连接对象在那之后,你可以 promisify 函数并像下面这样使用 promise :-
var promisified = Promise.promisify(sqlGun);
promisified(query, {}).then( function() {} );