我在Sailsjs中的控制器内执行以下代码。底层适配器是sails-orientdb。我收到以下错误
TypeError:无法调用未定义的方法'然后'
为什么会出现此错误?
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");
});
答案 0 :(得分:3)
扩展@jaumard所说的内容。
通常建议您使用find()
,例如update()
,create()
,destroy()
,query()
等。这些方法支持回调并且承诺和这些方法将对任何水线适配器(OrientDB,MySQL,MongoDB等)采用相同的方式。
有时你可能想要做一些标准水线方法不支持的更复杂的事情,而sails-orientdb在standard waterline query methods中用.query()
扩展了水线定义。
// Assume a model named "Friend"
Friend.query("SELECT FROM friendTable WHERE name='friend query'", function(err, retrievedUsers){
console.log(retrievedUsers);
});
sails-orientdb查询使用回调,因此您可以像这样使用它:
Friend.query("SELECT FROM friendTable WHERE name='friend query'")
.then(function(retrievedUsers){
console.log(retrievedUsers);
});
更新:自v0.10.53以来也支持以下内容:
query()
如果您真的想使用承诺机制,您有两个选择:
var queryPromise = Promise.promisify(User.query);
queryPromise('select...').then(function(){/*...*/})
使用other methods承诺的promisify。例如:
getDB()
db
另一种选择是使用sails-orientdb自定义方法bluebird。此方法返回getDB
User.getDB().query('select from OUser where name=:name', {
params: {
name: 'Radu'
},
limit: 1
}).then(function (results){
console.log(results);
});
实例,该实例可用于promisified查询。例如:
{{1}}
答案 1 :(得分:0)
我不认为承诺适用于.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
});
对于帆和水线,当你不需要时,不建议使用.query。
请参阅本教程,它可能有所帮助:http://documentup.com/kriskowal/q/#tutorial/chaining