Sequelize同步ORM

时间:2016-11-05 03:10:23

标签: node.js sequelize.js

您好我使用sequelize并且我想进行同步查询,但这是异步进行并返回错误的响应。 我有这段代码:

function(user) {
  var allow = false;
  return User.find({ where: { id: user.id},
    include: [{
      model: Plan,
      attributes: ['id', 'name']
    }]
  }).then(function(u) {
    if(!u) throw new Error("0 user not found");
    user = u.dataValues;
    var plan = user.plan.dataValues.name;
    else if (plan == "Premium") allow = true;
    console.log("allow", allow);
    return allow;
  }).catch(function(error){
    console.log("error:::", error);
  });
}

console.log('allow', allow);正在打印true但是当我调用该函数时,函数返回false

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您不能使异步代码同步,因此您将不得不处理异步性。

然而,它不是困难,因为你的函数已经返回了一个承诺。您可以使用它将allow变量传递给调用者:

yourFunction(user).then(function(allow) {
  console.log('allow', allow);
});

答案 1 :(得分:-1)

我认为return allow;语句是function(u) {}内的.then()函数的返回值,而不是function (user) {}

此外,User.find()会返回一个承诺。如果你读到Promise,你会发现有一些方法可以解决你的问题。 这是一个:

var myFunc = function(user, callback) {
  var allow = false;
  User.find({ where: { id: user.id},
    include: [{
      model: Plan,
      attributes: ['id', 'name']
    }]
  }).then(function(u) {
    if(!u) throw new Error("0 user not found");
      user = u.dataValues;
      var plan = user.plan.dataValues.name;
    else if (plan == "Premium") allow = true;

    callback(null, allow);

  }).catch(function(error){
    callback(error);
  });
}

然后你可以使用这个功能:

myFunc(user, function (err, allow) {
  // Do not forget to handle error

  // `allow` now could be used here
  console.log(allow);
});