2

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

2 回答 2

3

扩展@jaumard 所说的内容。

背景

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

有时您可能想做一些标准水线方法不支持的更复杂的事情,为此,sails-orientdb 使用 扩展了水线定义query(),以及其他方法

帆东方数据库.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);
});

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

许诺query()

通过使用bluebird promise 的 promisify。例子:

var queryPromise = Promise.promisify(User.query);
queryPromise('select...').then(function(){/*...*/})

利用getDB()

另一种选择是使用sails-orientdb 自定义方法getDB。此方法返回一个可用于承诺查询的Oriento实例。 db例子:

User.getDB().query('select from OUser where name=:name', {
  params: {
    name: 'Radu'
  },
  limit: 1
}).then(function (results){
  console.log(results);
});
于 2015-03-29T20:19:06.920 回答
0

我认为 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

于 2015-03-28T23:34:12.737 回答