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
相关产品推荐
相关产品推荐

