You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask jsonify返回undefined排查:电影选座预订前端fetch接收异常

问题根源:Promise链中缺少返回值

你遇到的问题核心在于前端fetch的Promise链里,第一个.then()没有返回response.json()的结果,导致后续的.then()接收不到数据,自然就是undefined了。

具体分析

当你调用response.json()时,它返回的是一个新的Promise,但如果不在.then()里把这个Promise返回出去,下一个.then()就会默认接收到undefined(因为函数没有显式返回值时默认返回undefined)。你的代码里只是执行了response.json(),但没有把它传递到下一个链式调用中。

修正后的JS代码

function sendReservationToServer() {
  const selectedSeats = sessionStorage.getItem('selectedSeats')
  const reservation = { userId, selectedSeats, showTimeId, movieHallId }
  fetch('/bookSeats', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(reservation)
  }).then(response => {
    // 关键:这里需要return,把response.json()的Promise传递给下一个then
    return response.json()
  }).then(data => {
    // 注意:Flask的jsonify返回的是带message字段的JSON对象,所以要取data.message
    theatreHall.innerHTML = `${data.message} <br> <a href='/home'>Back to main menu</a>`
    console.log(data.message)
  }).catch(err => infoMsg.textContent = err)
  sessionStorage.clear()
}

顺便提一句:Flask的jsonify(message)实际上会返回结构为{"message": "你的成功文本"}的JSON对象,直接用data的话会显示[object Object],所以上面的代码也一并修正了这个细节。

额外优化建议(可选)

你的Flask代码虽然能正常保存数据,但可以增加错误处理和事务优化,让代码更健壮:

@app.route("/bookSeats", methods=["POST"])
def book_seats():
    try:
        selected_seats = request.json
        user_id = selected_seats.get('userId')
        seats = json.loads(selected_seats.get('selectedSeats'))
        movie_hall_id = selected_seats.get('movieHallId')
        seat_ids = []
        showtime_id = selected_seats.get('showTimeId')
        
        # 用first()替代all()[0],避免找不到座位时抛出索引越界错误
        for seat in seats:
            seat_obj = db.session.query(Seat).filter(
                Seat.seat_number == seat,
                Seat.movie_hall_id == movie_hall_id
            ).first()
            if not seat_obj:
                return jsonify({"error": f"Seat {seat} not found in this hall"}), 404
            seat_ids.append(seat_obj.stid)
        
        # 合并commit操作,减少数据库交互,同时保证事务原子性
        for seat in seat_ids:
            reserved_seat = ReservedSeat(
                seat_id=seat,
                show_time=showtime_id,
                user=user_id)
            db.session.add(reserved_seat)
        
        reservation = Reservation(
            user=user_id,
            show_time=showtime_id,
            number_of_tickets=len(seat_ids))
        db.session.add(reservation)
        
        db.session.commit()
        message = f'{seats} booked successfully'
        return jsonify({"message": message})
    
    except Exception as e:
        # 出错时回滚事务,避免脏数据
        db.session.rollback()
        return jsonify({"error": str(e)}), 500

内容的提问来源于stack exchange,提问作者outlier11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:27:29