将Sequelize与NodeJS一起使用,并且findByPk返回挂起

时间:2018-11-28 22:13:28

标签: node.js sequelize.js

您好,我尝试使用Sequelize,并且需要在DB中返回一个Object,这是我的一段代码;

像这样的简单

const { User, Appointment } = require('../models')
const moment = require('moment')
const { Op } = require('sequelize')

class MyAppointmentController {
  async index(req, res) {
    const { id } = req.session.user

    const appoitments = await Appointment.findAll({
      where: {
        providerId: id,
        date: {
          [Op.between]: [
            moment()
              .startOf('day')
              .format(),
            moment()
              .endOf('day')
              .format()
          ]
        }
      }
    })

    const available = appoitments.map(appoint => {
      const user = User.findByPk(appoint.userId).then(res => {
        console.log('Issue', res)
      })

      return {
        appoint,
        date: moment(appoint.date).format('HH:mm'),
        user: user.name,
        avatar: user.avatar
      }
    })

    return res.render('appointments/list', { available })
  }
}
module.exports = new MyAppointmentController()

我知道这是一个承诺,但不可能获得回报... 控制台res是print属性

但是 用户 总是 待审核 ,如果我尝试这样做

const user = User.findByPk(appoint.userId).then(res => {
            another_var = res
            return res
          })

console.log(enother_var)<<未定义

为什么会这样?而我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

如果您要遍历列表,但需要对每个列表进行异步调用,建议您使用async/await

class MyAppointmentController {
  async index(req, res) {
    const { id } = req.session.user

    const appoitments = await Appointment.findAll({
      where: {
        providerId: id,
        date: {
          [Op.between]: [
            moment()
              .startOf('day')
              .format(),
            moment()
              .endOf('day')
              .format()
          ]
        }
      }
    })

    const available = [];

    for (appoint of appoitments) {
      const user = await User.findByPk(appoint.userId);

      available.push({
        appoint,
        date: moment(appoint.date).format('HH:mm'),
        user: user.name,
        avatar: user.avatar
      })
    };

    return res.render('appointments/list', { available })
  }
}

这就是您的代码无法正常工作的原因:

  • 您在.map上致电appoitments,但从未返回任何东西。调用.map时必须返回一个值。就您而言,您可能打算返回用户实例列表;
  • 在循环中,您为承诺分配了user,而不是承诺的结果。这就是为什么它总是读为pending的原因。
  • 如果要在循环内调用异步方法,则必须等待该方法完成。