TypeError: Cannot call method 'then' of undefined
TypeError: Cannot call method 'then' of undefined
我在 Sailsjs 的控制器中执行了以下代码。底层适配器是 sails-orientdb。我收到以下错误
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");
});
我认为 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
});
对于风帆和吃水线,不建议您在不需要时使用 .query。
查看本教程可能会有所帮助:http://documentup.com/kriskowal/q/#tutorial/chaining
扩展@jaumard 所说的内容。
背景
通常推荐使用standard waterline query methods如find()
、update()
、create()
、destroy()
等,这些方法支持回调和promise这些方法对任何水线适配器(OrientDB、MySQL、MongoDB 等)的工作方式相同。
有时您可能想做一些更复杂的事情,这不受标准水线方法的支持,为此 sails-orientdb 将水线定义扩展为 query()
,其中 other methods.
sails-orientdb .query()
sails-orientdb 查询使用回调,所以你可以像这样使用它:
// 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);
});
如果你真的想使用 promise 机制,你有两个选择:
承诺 query()
通过使用 bluebird promise 的 promisify。示例:
var queryPromise = Promise.promisify(User.query);
queryPromise('select...').then(function(){/*...*/})
使用getDB()
另一种选择是使用 sails-orientdb 自定义方法 getDB
. This method returns an Oriento db
实例,它可用于 promisified 查询。示例:
User.getDB().query('select from OUser where name=:name', {
params: {
name: 'Radu'
},
limit: 1
}).then(function (results){
console.log(results);
});
我在 Sailsjs 的控制器中执行了以下代码。底层适配器是 sails-orientdb。我收到以下错误
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");
});
我认为 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
});
对于风帆和吃水线,不建议您在不需要时使用 .query。
查看本教程可能会有所帮助:http://documentup.com/kriskowal/q/#tutorial/chaining
扩展@jaumard 所说的内容。
背景
通常推荐使用standard waterline query methods如find()
、update()
、create()
、destroy()
等,这些方法支持回调和promise这些方法对任何水线适配器(OrientDB、MySQL、MongoDB 等)的工作方式相同。
有时您可能想做一些更复杂的事情,这不受标准水线方法的支持,为此 sails-orientdb 将水线定义扩展为 query()
,其中 other methods.
sails-orientdb .query()
sails-orientdb 查询使用回调,所以你可以像这样使用它:
// 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);
});
如果你真的想使用 promise 机制,你有两个选择:
承诺 query()
通过使用 bluebird promise 的 promisify。示例:
var queryPromise = Promise.promisify(User.query);
queryPromise('select...').then(function(){/*...*/})
使用getDB()
另一种选择是使用 sails-orientdb 自定义方法 getDB
. This method returns an Oriento db
实例,它可用于 promisified 查询。示例:
User.getDB().query('select from OUser where name=:name', {
params: {
name: 'Radu'
},
limit: 1
}).then(function (results){
console.log(results);
});