고양이와 코딩
You have tried to call .then(), .catch(), or invoked await on the result .. 어쩌구 mysql2 에러 해결하기 본문
node.js
You have tried to call .then(), .catch(), or invoked await on the result .. 어쩌구 mysql2 에러 해결하기
ovovvvvv 2024. 4. 6. 17:12728x90
import jwt from "jsonwebtoken";
import { Request, Response } from "express";
import connection from "../db/mariadb";
import { StatusCodes } from "http-status-codes";
import { RowDataPacket } from "mysql2";
import authenticateUser from "../middlewares/authentication";
// 노트 추가
const addNote = async (
req: Request & { user?: { id: Number } },
res: Response
) => {
let authorization = authenticateUser(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되었습니다. 다시 로그인해주세요.",
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "잘못된 토큰입니다.",
});
} else if (authorization instanceof Object) {
let { title, content } = req.body;
let userId = authorization.id;
let sql = "INSERT INTO notes (title, content, user_id) VALUES (?, ?, ?)";
let result = await connection.query(sql, [title, content, userId]);
console.log(result);
connection.query(sql, [title, content, userId], (err, results) => {
if (err) {
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
message: "에러가 발생했습니다.",
});
} else {
res.status(StatusCodes.CREATED).json({
message: "노트가 추가되었습니다.",
});
}
});
}
};
노트를 작성하는 api를 만들고 postman으로 테스트를 하는데, statuscode 에러도 아닌 에러가 발생했습니다
vscode 로그에는
You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://sidorares.github.io/node-mysql2/docs#using-promise-wrapper, or the mysql2 documentation at https://sidorares.github.io/node-mysql2/docs/documentation/promise-wrapper
/Users/jin/Desktop/document-editor/backend/node_modules/mysql2/lib/commands/query.js:43
throw new Error(err);
^
이 에러는 Promise나 async/await 구문을 사용하여 비동기 작업을 처리할 때, 해당 메서드가 Promise를 반환하지 않아서 발생하는 에러라고 합니다.
기존의 코드는 아래와 같습니다.
const result = await connection.query(sql, [title, content, userId]);
여기서 connection.query()가 Promise를 반환하지 않아서 .then() 또는 .catch()를 사용할 수 없습니다.
수정 후에는 MySQL2 모듈의 Promise wrapper를 사용했습니다.
connection.promise().query() 메서드를 사용해서 비동기 쿼리를 수행합니다!
try {
const [result] = await connection.promise().query(sql, [title, content, userId]);
console.log(result);
res.status(StatusCodes.CREATED).json({
message: "노트가 추가되었습니다.",
});
} catch (err) {
console.error(err);
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
message: "에러가 발생했습니다.",
});
}
전체 note 코드
import jwt from "jsonwebtoken";
import { Request, Response } from "express";
import connection from "../db/mariadb";
import { StatusCodes } from "http-status-codes";
import { RowDataPacket } from "mysql2";
import authenticateUser from "../middlewares/authentication";
// 노트 추가
const addNote = async (
req: Request & { user?: { id: Number } },
res: Response
) => {
let authorization = authenticateUser(req);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "로그인 세션이 만료되었습니다. 다시 로그인해주세요.",
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: "잘못된 토큰입니다.",
});
} else if (authorization instanceof Object) {
let { title, content } = req.body;
let userId = authorization.id;
let sql = "INSERT INTO notes (title, content, user_id) VALUES (?, ?, ?)";
try {
const [result] = await connection
.promise()
.query(sql, [title, content, userId]);
console.log(result);
res.status(StatusCodes.CREATED).json({
message: "노트가 추가되었습니다.",
});
} catch (err) {
console.error(err);
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
message: "에러가 발생했습니다.",
});
}
}
};
export { addNote };
정리
콜백 방식보다 async/await + Promise를 사용하는 편이 비동기 작업 처리를 더 직관적으로 보이게 한다
수정 이전의 코드는 async/await 구문을 사용하고 있으나 connection.query() 메서드를 통해 쿼리를 실행하고 있을 때
Promise를 반환하지 않고 콜백을 사용했기 때문에 문제가 발생했다!
'node.js' 카테고리의 다른 글
[node] 비밀번호 암호화 - 회원가입, 로그인 구현하기 (0) | 2024.02.24 |
---|---|
미들웨어 및 라우트 실행 과정 (0) | 2024.01.28 |
리액트를 다루는 기술 node.js esm 에러 해결 (2) | 2024.01.14 |
Koa 프레임워크에서 koa-router 사용해보기 (0) | 2024.01.08 |