[트러블 슈팅][Node.js] mysql2 execute의 Prepared Statements 관련 오류

Young Min Kang·2024년 6월 1일

트러블 슈팅

목록 보기
4/5
post-thumbnail

execute의 Prepared Statements 에러

장바구니 아이템 삭제 API에서 query를 excute 변경과 비동기 처리를 하던 도중 발생한 오류이다.

문제😲

에러코드

const removeCartItem = async (req, res) => {
    const conn = await connection();
    const cartItemId = req.params.id;
    try {
        let sql = `DELETE FROM cartItems WHERE id = ?`
        const [results] = await conn.execute(sql, cartItemId);

        return res.status(StatusCodes.OK).json(results);
    } catch (err) {
        console.error(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
    } finally {
        await conn.end(); // 연결 종료
    }
};

형식

에러 상황 및 메시지

타입에러가 발생한 모습이다.

TypeError: Bind parameters must be array if namedPlaceholders parameter is not enabled

해결🚀

mysql2 라이브러리에서 execute 메서드를 사용할 때 바인드 파라미터가 배열 형태여야 하는 이유는 Prepared Statements의 특성 때문이다. 이 메서드는 SQL 인젝션을 방지하고 성능을 최적화하기 위해 바인드 파라미터를 사용한다.

아무튼 배열로서 그 값을 받는 것이 특징이다.

최종✔️

최종 코드

const removeCartItem = async (req, res) => {
    const conn = await connection();
    const cartItemId = req.params.id;
    try {
        let sql = `DELETE FROM cartItems WHERE id = ?`
        const [results] = await conn.execute(sql, [cartItemId]);

        return res.status(StatusCodes.OK).json(results);
    } catch (err) {
        console.error(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
    } finally {
        await conn.end(); // 연결 종료
    }
};

결과 사진

profile
꾸준히 한걸음씩

0개의 댓글