2014-02-19 9 views
10

Ich habe Probleme mit Sails.JS 0.9.8. Ich möchte Versprechungen mit der Funktion Model.query() verwenden (ich benutze sails-mysql-Adapter).Wie man Model.query() mit Versprechen in SailsJS/Waterline verwendet?

Dieser Code wird funktionieren:

User.findOne({ email: email }) 
.then(function(user) { 
    console.log(user); 
}); 

aber dieser wird nicht

User.query("SELECT email FROM user WHERE email = ?", [ email ])) 
.then(function(err, rows) { 
    console.log(rows); 
}) 

ich undefined erhalten sowohl für 'err' und 'Reihen'.

Ist es einfach nicht implementiert oder mache ich etwas falsch? Falls nicht implementiert, gibt es eine Alternative, Versprechungen mit .query() zu verwenden?

Vielen Dank im Voraus

Antwort

22

Sie können sich promisify(User.query), so wie du für andere Callback-basierte API tun würde, wie:

var Promise = require('bluebird'); 

....

var userQueryAsync = Promise.promisify(User.query); 
userQueryAsync("SELECT email FROM user WHERE email = ?", [ email ]) 
.then(function(user) { 
    console.log(user); 
}); 
+0

Ausgezeichnete Antwort. +1 – dooburt

+1

Sehr schön-- wir verlinken hier jetzt von der Referenzseite von '.query()' in den Segeln-Dokumenten. – mikermcneil

+0

Ich bekomme nur node_module/sails-mysql/knotenmodule/mysql/lib/protokoll/Parser.js: 77 throw err; // Rethrow non-MySQL Fehler ^ RangeError: Offset ist außerhalb der Grenzen – Crusader

3

Die query Methode Segel-mysql spezifisch ist, und latente Objekte den Weg nicht akzeptiert, dass die allgemeineren Waterline Adapter Methoden (z findOne, find, create, etc) zu tun. Sie müssen einen Rückruf als zweites Argument angeben.

4

Als Hack Sie alle monkeypatch können Ihre Modelle in Bootstrap-ähnliche

module.exports.bootstrap = function(cb) { 
    var Promise = require('bluebird'); 

    Object.keys(sails.models).forEach(function (key) { 
     if (sails.models[key].query) { 
      sails.models[key].query = Promise.promisify(sails.models[key].query); 
     } 
    }); 

    cb(); 
}; 
1

Falls Sie wollen SailsModel.quer nicht verwenden promisify aber wollen y zu ein Versprechen zurückgeben.

/** 
* @param {Model} model - an instance of a sails model 
* @param {string} sql - a sql string 
* @param {*[]} values - used to interpolate the string's ? 
* 
* @returns {Promise} which resolves to the succesfully queried strings 
*/ 
function query(model, sql, values) { 
    values = values || []; 

    return new Promise((resolve, reject) => { 

    model.query(sql, values, (err, results) => { 
     if (err) { 
     return reject(err); 
     } 

     resolve(results); 
    }); 
    }); 
} 

// and use it like this 
query(User, 'SELECT * FROM user WHERE id = ?', [1]).then(console.log);