[ErrorFix] TypeORM migration run 도중에 발생한 에러

심채원·2023년 5월 12일
0

-deprecated-

목록 보기
11/11

아직도 에러 원인을 모르겠음.
foreign key 제약을 준 다른 테이블들은 모두 run에 성공하였으나, 딱 encounter 테이블과 연관된 테이블에서만 문제가 발생.

typeorm 드라이버까지 들어가서 콘솔을 찍으며 확인을 해봤으나, 아직까지 원인 파악이 되지 않음.

  • addColumn API도 에러를 고쳐보기 위한 노력이었다.. 삼일간의 테이블이 생성되지 않는 문제 드디어 해결
const { Table, TableForeignKey, TableColumn } = require("typeorm");

module.exports = class CreateEncounterTalkTbl1683711208609 {
	async up(queryRunner) {
		await queryRunner.createTable(
			new Table({
				name: "encounter_talk",
				columns: [
					{
						name: "id",
						type: "serial",
						isPrimary: true,
						isNullable: false,
						generationStrategy: "increment",
					},
				],
			}),
			true,
			true
		);

		await queryRunner.addColumn(
			"encounter_talk",
			new TableColumn({
				name: "encounter_id",
				type: "int",
				isNullable: false,
			})
		);
		await queryRunner.addColumn(
			"encounter_talk",
			new TableColumn({
				name: "talk_id",
				type: "int",
				isNullable: false,
			})
		);

		await queryRunner.createForeignKey(
			"encounter_talk",
			new TableForeignKey({
				name: "encounter_id",
				columnNames: ["encounter_id"],
				referencedColumnNames: ["id"],
				referencedTableName: "encounter_situations",
				onDelete: "CASCADE",
			})
		);

		await queryRunner.createForeignKey(
			"encounter_talk",
			new TableForeignKey({
				name: "talk_id",
				columnNames: ["talk_id"],
				referencedColumnNames: ["id"],
				referencedTable: "small_talk",
				onDelete: "CASCADE",
			})
		);
	}

	async down(queryRunner) {
		await queryRunner.dropTable("encounter_talk");
	}
};

오류 콘솔

  • undefined 속성의 값에 split 메서드를 불러올 수 없다는 에러인데, 작성한 코드에서 undefined는 존재하지 않는다. 하지만 콘솔에서 split하는 대상을 출력하면 undefined가 출력된다.
TypeError: Cannot read properties of undefined (reading 'split')
    at PostgresDriver.parseTableName (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/driver/postgres/PostgresDriver.js:669:30)
    at PostgresDriver.parseTableName (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/driver/postgres/PostgresDriver.js:651:33)
    at PostgresQueryRunner.getTablePath (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/query-runner/BaseQueryRunner.js:222:47)
    at PostgresQueryRunner.createForeignKeySql (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:2496:48)
    at PostgresQueryRunner.createForeignKey (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:1430:25)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async CreateEncounterTalkTbl1683711208609.up (/Users/simchaewon/Desktop/small_talkie/db/migrations/1683711208609-create_encounter_talk_tbl.js:35:3)
    at async MigrationExecutor.executePendingMigrations (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/migration/MigrationExecutor.js:225:17)
    at async DataSource.runMigrations (/Users/simchaewon/Desktop/small_talkie/node_modules/typeorm/data-source/DataSource.js:260:35)
    at async Object.handler (/Users/simchaewon/.nvm/versions/node/v16.19.0/lib/node_modules/typeorm/commands/MigrationRunCommand.js:68:13)    

- 혹시라도... 같은 어려움을 겪으신 분이 계신다면 제 코드와 오류 좀 봐주세요...


수정후 코드

수정 사항

  • 변수에 new TableForeignKey()로 해당 컬럼의 ForeignKey 인스턴스를 할당하여 Typeorm의 queryRunner를 사용하여 foreignkey를 생성함.
const { Table, TableForeignKey } = require("typeorm");

module.exports = class CreateEncounterTalkTbl1683711208609 {
	async up(queryRunner) {
		await queryRunner.createTable(
			new Table({
				name: "encounter_talk",
				columns: [
					{
						name: "id",
						type: "serial",
						isPrimary: true,
						isNullable: false,
						generationStrategy: "increment",
					},
					{
						name: "encounter_id",
						type: "int",
						isNullable: false,
					},
					{
						name: "talk_id",
						type: "int",
						isNullable: false,
					},
				],
			}),
			true,
			true
		);

		const encounter_fk = new TableForeignKey({
			columnNames: ["encounter_id"],
			referencedColumnNames: ["id"],
			referencedTableName: "encounter_situations",
			onDelete: "CASCADE",
		});
		const talk_fk = new TableForeignKey({
			columnNames: ["talk_id"],
			referencedColumnNames: ["id"],
			referencedTableName: "small_talk",
			onDelete: "CASCADE",
		});

		await queryRunner.createForeignKey("encounter_talk", encounter_fk);

		await queryRunner.createForeignKey("encounter_talk", talk_fk);
	}

	async down(queryRunner) {
		await queryRunner.dropTable("encounter_talk");
	}
};

겪고 있는 어려움

  • TypeORM은 '타입'이라는 (Javascript에서의) 특수성 때문인지, TS를 지원하는 Nest.js 환경의 자료들이 많고, Express 서버에서 사용하는 사례들이 상대적으로 부족
profile
인생의 디테일을 추가하는 심채원

0개의 댓글