[ERROR] Node.js this error

김택주·2023년 2월 23일

ERROR

목록 보기
2/13

문제


module.exports = {

	async test (params) {
		const { 
			result,
			objects = [], 
			NextContinuationToken 
		} = await storage.test(params);

		if (result) {
			if (NextContinuationToken) {
				const {
					objects: recursiveObjects = [],
				} = await this.test({ ...params, continuationToken: NextContinuationToken });

				return {
					objects: objects.concat(recursiveObjects)
				}
			}
		} 

		return {
			objects
		}
	},
}

위 코드에서 this.test 재귀를 호출하려고 하면 this.test 가 undefined로 나와 에러가 발생한다
node 에서는 function 함수와 화살표 함수의 this 가 가르키는것이 다르다

function : module.exports
화살표 : global

위 내용을 가르키고 있어 나는 위 내용을 인지하고 있어 function 함수로 작성하여 this를 사용하였지만
undefined가 나왔다

원인 및 조치


이유는 this의 바인딩 문제다 기본적으로 this는 호출한 객체를 가르킨다
this.test 를 실행했다면 이 코드를 실행한 함수가 곧 this가 된다.

다른 속성 함수에서 test 함수를 실행했을때는 그 속성 함수는 module.exports 의 속성함수 므로
thismodule.exports를 가르킨다

하지만 test 함수 내에서 this.test를 호출 시 호출 객체는 test 함수다
test 함수내 test 라는 함수를 가지고 있지않아 그래서 undefined 가 나왔다
test 함수는 module.exports 의 속성 함수이므로 module.exports.test 로 호출해야 undefined 가 나오지 않는다.

module.exports = {

	async test (params) {
		const { 
			result,
			objects = [], 
			NextContinuationToken 
		} = await storage.test(params);

		if (result) {
			if (NextContinuationToken) {
				const {
					objects: recursiveObjects = [],
				} = await module.exports.test({ ...params, continuationToken: NextContinuationToken });

				return {
					objects: objects.concat(recursiveObjects)
				}
			}
		} 

		return {
			objects
		}
	},
}

0개의 댓글