【问题标题】:TypeError: Cannot call method 'then' of undefinedTypeError:无法调用未定义的方法“then”
【发布时间】:2015-03-28 23:27:56
【问题描述】:

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

【问题讨论】:

  • 试试User.queryAsync

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


【解决方案1】:

扩展@jaumard 所说的内容。

背景

通常建议使用standard waterline query methods,例如find()update()create()destroy()等。这些方法支持回调和承诺,这些方法对任何水线适配器的工作方式相同(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);
});

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

承诺query()

通过使用bluebird 承诺的承诺。示例:

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);
});

【讨论】:

  • 我正在执行一系列查询,我必须返回一个在前端呈现的 JSON 对象。其中一个查询是使用 orient 的图形方法的自定义查询。以上提供了解决方案。
  • @TommyK,因为 v0.10.53 .query 也支持承诺。我已经更新了我的答案以反映这一点。
【解决方案2】:

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

【讨论】:

  • 在某些情况下我需要使用 .query。我该如何使用 Promise?
  • 我只是认为你不能将 promise 与 .query 一起使用,但又不知道足够的 promise,我从不使用 .query 和 promise sorry。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多