[초보] "x is not a constructor" error 관련 질문드립니다.

위의 깃헙의 README의 usage를 확인해보면

import Fotmob from 'fotmob';
const fotmob = new Fotmob();

let matches = await fotmob.getMatchesByDate("20201020");
let league = await fotmob.getLeague("42", "overview", "league", "America/New_York")
let team = await fotmob.getTeam("6017", "overview", "team", "America/New_York")
let player = await fotmob.getPlayer("1071179")
let details = await fotmob.getMatchDetails("3399269")

이런식으로 예제가 작성되어있습니다.
npm install fotmob 후 위와 같이 예제를 작성하고 node app.js으로 파일을 실행해본 결과

var fotmob = new Fotmob();
             ^

TypeError: Fotmob is not a constructor

이러한 에러가 나네요.
fotmob이 class인데 왜 constructor가 아니라는 내용의 error가 나는걸까용…

안녕하세요!

Node.js 환경에서는 import 문법을 기본적으로 사용할 수 없습니다. 기존의 CommonJS 형태인 require 문법을 사용해야 합니다. 타입스크립트로 작성된 라이브러리를 Node.js 환경에서 사용하려면 타입스크립트 코드를 자바스크립트로 변환한 후 require 문법을 이용해 라이브러리를 불러와야 합니다.

아래는 코드를 수정한 예시입니다:

// 타입스크립트 코드에서 자바스크립트로 변환된 파일을 불러옵니다.
const Fotmob = require('fotmob').default;
const fotmob = new Fotmob();

const getMatches = async () => {
  let matches = await fotmob.getMatchesByDate("20201020");
  let league = await fotmob.getLeague("42", "overview", "league", "America/New_York");
  let team = await fotmob.getTeam("6017", "overview", "team", "America/New_York");
  let player = await fotmob.getPlayer("1071179");
  let details = await fotmob.getMatchDetails("3399269");
};

getMatches();

node의 기본값이 commonjs인것은 맞지만 ES Module을 아주 사용할 수 없는 것은 아닌 것으로 알고 있습니다. 다만, Fotmob 모듈 같은 경우 아예 처음부터 Typescript로 만들어졌고, 빌드하는 과정에서 ES Module이 아닌 CommonJS를 타겟으로 빌드되었습니다.

해당 예제는 typescript 파일을 기본으로 하는 것 같습니다. 아마도, 저 예제대로 하시려면 typescript로 import 문법대로 작성하고, package.json이랑 tsconfig.json을 세팅하셔서 써야할 것 같아요.

순수 자바스크립트만으로 해결하려면 위에 댓글 달아주신 분 말씀대로 commonJS 스타일의 모듈( require 함수로 불러오는 방식 ) 을 써야 할 것 같아요.