前段时间我决定从PHP切换到节点。在我的第一个项目中,我不想使用任何ORM,因为我认为我不需要复杂化我的生活那么多学习另一件事(目前我正在学习节点和角度)因此我决定使用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);
}
});
如何使用蓝鸟宣传这种功能?我已经尝试了......但我在这里寻求帮助。这就是我试过的
var Thing = Promise.promisifyAll(require('./models/thing.service.js'));
Thing.list().then(function(){})
答案 0 :(得分:12)
我这样做了,工作正常。
const connection = mysql.createConnection({.....});
global.db = Bluebird.promisifyAll(connection);
db.queryAsync("SELECT * FROM users").then(function(rows){
console.log(rows);});
答案 1 :(得分:8)
我从来没有好运过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);
})
答案 2 :(得分:1)
您还可以创建一个像这样触发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({})之后的连接对象。
之后,您可以宣传该功能并使用以下承诺: -
var sqlGunPromise = Promise.promisify(sqlGun);
sqlGunPromise(query, {}).then( function() {} );