TypeError:无法调用未定义的方法'then'

时间:2015-03-28 23:27:57

标签: node.js promise sails.js bluebird sails-orientdb

我在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");
    });

2 个答案:

答案 0 :(得分:3)

扩展@jaumard所说的内容。

背景

通常建议您使用find(),例如update()create()destroy()query()等。这些方法支持回调并且承诺和这些方法将对任何水线适配器(OrientDB,MySQL,MongoDB等)采用相同的方式。

有时你可能想要做一些标准水线方法不支持的更复杂的事情,而sails-orientdb在standard waterline query methods中用.query()扩展了水线定义。

sails-orientdb // 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()

如果您真的想使用承诺机制,您有两个选择:

promisify 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