等待赋值器findOne检查数据库,然后返回值

时间:2018-10-13 23:47:42

标签: node.js sequelize.js

我不确定自己在做什么错。但是我有这个小功能:

tripStatus (id) {



db.Trip.findOne({ attributes:['status'], where: {id: id} }).then(trip => {
    // trip will be null if not found else contains information about the trip

    if(trip!=null){

        console.log('found ', trip.dataValues['status']);
        return trip.dataValues['status'];


    }
    else{
        return -1;
    }
  }).catch(err=>{

      return -1;
  })


}

现在我这样称呼它:

  var status=TripFunctions.tripStatus(1)
  //console out puts now in order of display on the console
  console.log(status) // gives undefined. FIrst out put
  'SELECT status from Trip WHERE id=1'
  "Found status 3"

它立即返回值。

1 个答案:

答案 0 :(得分:1)

您将在Sequelize创建的Promise中返回值,但不会从函数中返回该承诺。解析promise中的值并返回,以便您可以等待结果。

您还应该使用Instance.getDataValue()函数而不是直接访问它们,或者如果只需要raw: true,最好使用status根本不构造对象-它会返回一个普通的JSON对象。可能也使用了Model.findById()

tripStatus (id) {
  // return the promise
  return db.Trip.findById(id, {
    attributes:['status'],
    raw: true,
  })
  .then(trip => {
    // trip will be null if not found else contains information about the trip
    return Promise.resolve(trip ? trip.status : -1);
  })
  .catch(err => {
    return Promise.resolve(-1);
  });
}

使用Promise称呼它

TripFunctions.tripStatus(1).then((status) => {
  // the status is available in the promise resolution
  if (status !== -1) {
    // do something
  }
});

使用async/await编写代码会更加简洁。

async function tripStatus (id) {
  const trip = await db.Trip.findById(id, {
    attributes:['status'], raw: true});
  return trip ? trip.status : -1;
}

然后您可以使用async/await来调用它。

const status = await TripFunctions.tripStatus(1);
if (status !== -1) {
  // do something
}