我在Sailsjs中的控制器内执行以下代码。底层适配器是sails orientedb。我得到以下错误返回
TypeError:无法调用未定义的方法"then"
为什么会出现这种错误?
User.query("select id from User where username='" + req.param("userid") + "'").then(function(userData){
console.log(userData);
return userData;
}).fail(function (err) {
console.log("Handled");
});
扩展@jaumard所说的内容。
背景
通常建议使用标准的水线查询方法,如find()
、update()
、create()
、destroy()
等。这些方法支持回调和promise,并且这些方法对任何水线适配器(OrientDB、MySQL、MongoDB等)都可以以相同的方式工作。
有时,您可能想做一些标准水线方法不支持的更复杂的事情,为此,Saints orientedb使用query()
等方法扩展了水线定义。
定向帆.query()
Saints orientedb查询使用回调,因此您可以这样使用它:
// Assume a model named "Friend"
Friend.query("SELECT FROM friendTable WHERE name='friend query'", function(err, retrievedUsers){
console.log(retrievedUsers);
});
更新:由于v0.10.53,还支持以下内容:
Friend.query("SELECT FROM friendTable WHERE name='friend query'")
.then(function(retrievedUsers){
console.log(retrievedUsers);
});
如果你真的想使用承诺机制,你有两个选择:
承诺query()
通过使用蓝鸟承诺的承诺。示例:
var queryPromise = Promise.promisify(User.query);
queryPromise('select...').then(function(){/*...*/})
使用getDB()
另一种选择是使用Saints orientedb自定义方法getDB
。此方法返回一个Oriento db
实例,该实例可用于承诺查询。示例:
User.getDB().query('select from OUser where name=:name', {
params: {
name: 'Radu'
},
limit: 1
}).then(function (results){
console.log(results);
});
我认为promise不适用于.query方法(也许我错了)。你可以用这个代替:
User.findOne()
.where({ username: req.param("userid") })
.then(function(user){
return user;
}).then(function(user){
//Do what you want
}).catch(function(err){
// An error occurred
});
对于船帆和水线,不建议在不需要的时候使用。查询。
请参阅本教程,它可能会有所帮助:http://documentup.com/kriskowal/q/#tutorial/chaining