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对象,所以你的数据库或者其他东西接收它时就会收到一个空