작성
·
46
·
수정됨
0
20분 정도에서 말씀주신 내용처럼 콘솔을 찍어보려고 하는데 다음과 같은 에러가 발생했습니다.
C:\developing\zeroCho\nodeJs\nodebird\models\index.js:19
file.index(".") !== 0 && file !== basename && file.slice(-3) === ".js"
^
TypeError: file.index is not a function
그래서 일단 코드를 다음과 같이 수정했습니다.
[기존 코드: return file.index(".") !== 0 &&...]
fs.readdirSync(__dirname)
.filter((file) => {
return (
!file.startsWith(".") && file !== basename && file.slice(-3) === ".js"
);
문제는 또 다른 에러가 발생했는데
C:\developing\zeroCho\nodeJs\nodebird\models>node index.js
hashtag.js Hashtag
C:\developing\zeroCho\nodeJs\nodebird\node_modules\sequelize\lib\model.js:662
throw new Error("No Sequelize instance passed");
^
Error: No Sequelize instance passed
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\node_modules\sequelize\lib\model.js:662:13)
at Hashtag.initiate (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at C:\developing\zeroCho\nodeJs\nodebird\models\index.js:30:11
at Array.forEach (<anonymous>)
at Object.<anonymous> (C:\developing\zeroCho\nodeJs\nodebird\models\index.js:25:4)
at Module._compile (node:internal/modules/cjs/loader:1469:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
at Module.load (node:internal/modules/cjs/loader:1288:32)
at Module._load (node:internal/modules/cjs/loader:1104:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
그래서 일단 이것도 modules 폴더 내에서 사용된 initate 메서드를 init으로 변경했습니다.
<예시>
const Sequelize = require("sequelize");
class Hashtag extends Sequelize.Model {
static init(sequelize) {
Hashtag.init({
title: {
type: Sequelize.STRING(15),
allowNull: false,
unique: true,
},
});
}
static associate(db) {}
}
module.exports = Hashtag;
그랬더니 이번에는 무한 재귀 에러가 발생하였습니다
C:\developing\zeroCho\nodeJs\nodebird\models>node index.js
hashtag.js Hashtag
C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5
Hashtag.init({
^
RangeError: Maximum call stack size exceeded
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
at Hashtag.init (C:\developing\zeroCho\nodeJs\nodebird\models\hashtag.js:5:13)
Node.js v20.18.0
대안은 super.init을 호출하는 것이라고 하는데 제가 지금 해결방향을 제대로 잡고 있는건지 아니면 점점 산으로 가고 있는건지 저 스스로는 판단이 안 됩니다. 사실 이 문제가 전 파트에서 시퀄라이저 진도 나갈 때도 발생했었는데 같은 문제가 다시 발생해서 굉장히 당황스럽습니다.
도움 부탁드립니다.
답변 3
0
class Hashtag extends Sequelize.Model {
static init(sequelize) {
Hashtag.init({
위처럼 작성자 분이 작성하신 코드대로 갔을 때 무한 재귀함수가 발생하는 이유는, Hashtag.init() 함수를 정의하는 곳 (2번째 줄) 안에서 다시 Hashtag.init() 함수를 호출 (3번째 줄) 하기 때문입니다.super.init()
을 활용하는 방식은 Sequelize 5버전에서 일반적으로 사용되던 방식입니다. Sequelize 6 버전 이후부터는 모델 정의 시 Model.init
을 직접 호출하는 방식이 권장되니, 제로초님의 방식대로 하는 것이 좋아 보입니다.
0
안녕하세요, 인프런 AI 인턴입니다. Backend Woonie님.
질문하신 내용을 보니, file.index(".") !== 0
부분에서 오류가 발생하고 있는 것 같습니다. 이는 fs.readdirSync(__dirname)
가 배열로 파일 목록을 반환하며, 이 배열 요소를 문자열로 가정하고 사용하고 있는 코드에서 문제가 발생했습니다. 이 오류를 수정하기 위해서 file
이 정확하게 문자열임을 가정할 수 있도록 처리해야 합니다.
현재 사용하신 수정된 코드에서 file.startsWith('.')
를 이용해 숨김 파일을 걸러주고 계신 점은 잘 처리하신 부분입니다.
이외에도 file.indexOf(".") !== 0
또한 file.startsWith(".")
로 대체하여 좀 더 명확하게 코드를 작성할 수 있으며, file
이 문자열임을 확실히 하는 방법 중 하나입니다. 이 방법은 파일이 문자열인 경우에만 작동하며, 배열 요소가 항상 문자열로 되어 있는지 확인해 보시는 것도 좋습니다.
아래의 질문들을 참고하면 이 문제와 관련된 더 많은 정보와 해결 방법을 확인할 수 있습니다:
해당 게시물에서는 파일 타입에 대한 이해와 관련된 조언을 얻을 수 있으며, 파일 시스템과 관련한 예외 처리 및 디버깅 방법도 확인해 보실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다.
하나만 더 여쭤보자면 initate를 init으로 수정할 필요는 없는걸까요?