[TIL] 10월 9일: CRUD에서 UPDATE 이슈

Jung·2021년 10월 9일
0

TIL

목록 보기
23/77
post-thumbnail

여행지 리뷰 수정 기능에서 제목, 장소, 리뷰 내용, 이미지를 변경하고 수정하기 버튼을 누르면 정상적으로 작동했다. 하지만 내용을 변경하지 않고 수정하기 버튼을 클릭하면 에러가 발생했다. 이 에러는 파일(이미지)을 선택하지 않고 수정해서 발생한 에러였다.

클라이언트 코드:

let get_link = window.location.search;
let do_split = get_link.split('=');
let trip_id = do_split[1];

let title = $('#title').val();
let place = $('#place').val();
let review = $('#review').val();
let file = $('#file')[0].files[0];

let form_data = new FormData();

form_data.append("file_give", file);
form_data.append("title_give", title);
form_data.append("place_give", place);
form_data.append("review_give", review);

$.ajax({
    type: "POST",
    url: `/trips/${trip_id}`,
    data: form_data,
    cache: false,
    contentType: false,
    processData: false,
    success: function (response) {
        alert(response["msg"])
        window.location.href = `/trips/place?content=${trip_id}`;
    }
});

서버 코드:

@app.route('/trips/<trip_id>', methods=['POST'])
def update_trip(trip_id):
    trip_title_receive = request.form['title_give']
    trip_place_receive = request.form['place_give']
    trip_review_receive = request.form['review_give']
    trip_file_receive = request.files['file_give']

    today = datetime.now()
    time = today.strftime('%Y-%m-%d-%H-%M-%S')

    filename = f'file-{time}'
    extension = trip_file_receive.filename.split('.')[-1]

    save_to = f'static/img/{filename}.{extension}'
    trip_file_receive.save(save_to)

    db.trips.update_one({'id': int(trip_id)}, {
        '$set': {
            'title': trip_title_receive, 'place': trip_place_receive, 'review': trip_review_receive,
            'file': f'{filename}.{extension}', 'date': today
        }
    })

    return jsonify({'msg': '수정 완료!'})

수정한 서버 코드:

@app.route('/trips/<trip_id>', methods=['POST'])
def update_trip(trip_id):
    trip_title_receive = request.form['title_give']
    trip_place_receive = request.form['place_give']
    trip_review_receive = request.form['review_give']

    new_doc = {
        'title': trip_title_receive,
        'place': trip_place_receive,
        'review': trip_review_receive
    }

    if 'file_give' in request.files:
        trip_file_receive = request.files['file_give']

        today = datetime.now()
        time = today.strftime('%Y-%m-%d-%H-%M-%S')

        filename = f'file-{time}'
        extension = trip_file_receive.filename.split('.')[-1]

        save_to = f'static/img/{filename}.{extension}'
        trip_file_receive.save(save_to)

        new_doc['file'] = f'{filename}.{extension}'

    db.trips.update_one({'id': int(trip_id)}, {'$set': new_doc})

    return jsonify({'msg': '수정 완료!'})

클라이언트에서 file 타입의 input에 선택된 파일이 있으면 변경된 파일과 제목, 장소, 리뷰 내용으로 db를 update 한다. 선택된 파일이 없으면 변경된 제목, 장소, 리뷰 내용만 update 하는 것으로 수정했다.

클라이언트에서 파일이 선택되지 않았는데 서버가 파일 데이터를 불러와 이용하려고 해서 발생했던 이슈였다!!

profile
97kim.github.io

0개의 댓글