`xxx POST /user/register 500 368ms - ....cannot be an array or an object`

xxx POST /user/register 500 368ms - ....cannot be an array or an object

这个错基本都是在async函数里少些了异步操作,需要补上一些await才行

await 表示在这里等待promise或者等待async函数中的promise返回结果了,再继续执行。

给几个例子:

在controllers–>user_controller.js里使用:

// 注册新用户
const register = async(ctx,next) => {
    ctx.status = 200 // post 默认是404
    const req = ctx.request.body
    const user_name = req.user_name
    const phonenumber = req.phonenumber
    var password =await encrypt(req.user_password) // 此处若不写await得到的将是一个promise对象
    console.log(password)
    // ctx.body = data
    let user = userModel.build({
        user_name,
        phonenumber,
        user_password: password
     });
     user = await user.save();     
     
} 

一开始没写var password =await encrypt(req.user_password)里的await于是报了这个错,我当时硬把结果String保存说可以的,但是打印出来是 promise:{…}然后就意识到应该这样操作。

// 获取打印票面信息
const getTicketByUserAndPlan = async(ctx,next) => {  
    const user_name = ctx.query.user_name    
    const plan_id = ctx.query.plan_id
    const userInfo = await getbUserId(userModel,user_name) // 注意await
    const user_id = userInfo[0].dataValues.user_id
    ctx.body = await ticketModel.findAll({  // 注意await
        where:{ user_id, plan_id},
        attributes: [ 'user_id', 'studio_name', 'startTime', 'endTime', 'seat_row', 'seat_col' ]
    })
}

上面代码两处不写await也会报一样的500的信息,因为利用sequelize对数据库的操作都是异步的!因此需要await等待它执行完毕再获取它的值

给出一些关于asnyc和await的资料

  • async的理解为:用于声明一个function是异步的,并且返回的是一个promise对象
  • await可以理解为同步等待当前的async的执行,且等async后的promise对象执行resolve,然后拿到resolve的值,作为await表达式的运算结果。代码才会继续往下执行
  • await在等待async异步方法执行完毕,await必须在async方法中才可以使用。
  • 也就是说我们调用异步方法时,如果不使用await,而是像我最初直接调用的话,就只会返回一个promise对象,所以你的数据库或者其他东西接收它时就会收到一个空
发布了46 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yuanfangyoushan/article/details/96842463