Help us understand the problem. What is going on with this article?

TypeScriptとTypeORMの組み合わせでSyntaxError: Unexpected token {

More than 1 year has passed since last update.

ちょいハマりした。

コイツ。

(node:93711) UnhandledPromiseRejectionWarning: /Users/username/project/src/entity/SomeEntity.ts:1
(function (exports, require, module, __filename, __dirname) { import {
                                                                     ^

SyntaxError: Unexpected token {
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
(node:93711) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:93711) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

こういうエラーがいちばん嫌い。

20180727214556.png

環境

typescript ^3.3.3333
typeorm ^0.2.14

経緯

typeormセットアップして、
それ用のEntityを作って、
tscして、
node dist/index.js

したら上記エラーが出た。

エラー内容的にはNodeに対応してない文法が存在しているって感じだけど、そもそもtsからjsにコンパイル済みだし、意味不明。

typescriptのコンフィグにもちゃんと下記は入れてる。

tsconfig.json
"module": "commonjs",
"target": "es6",

意味わかんねーよバーカ!

結論

typeormのドキュメントが分かりづらい。

typeormを利用する際、下記のようなconfigがプロジェクトルートに必要になる。
(厳密に言うと必須ではない。コード内に書くこともできるので)

ormconfig.json
{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "hogerahogera",
  "database": "mogeramogera",
  "synchronize": true,
  "logging": false,
  "entities": [
     "src/entity/**/*.ts"
  ],
  "migrations": [
     "src/migration/**/*.ts"
  ],
  "subscribers": [
     "src/subscriber/**/*.ts"
  ]
}

で、entitiesプロパティがプロジェクト内のEntity(他で言うmodel。要はテーブルを表す)の場所を指す。

のだが、僕のようにコンパイルしてからコンパイル後のファイルをnodeで動かしてる人の場合、上記の設定のままだとコンパイル後のjsファイルから、コンパイル前のtsファイルであるentityを読みに行ってしまう。

https://stackoverflow.com/questions/50361948/syntaxerror-unexpected-token-import-typeorm-entity

そんなん知るかよって感じ。

まあ徹頭徹尾ドキュメントを読んでない僕が悪いっちゃ悪いのだが、もうちょっと書きようはあると思う。

一応それっぽいことは、ドキュメント内のここに書いてあった。

修正後はこんな感じになります。

ormconfig.json
{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "hogerahogera",
  "database": "mogeramogera",
  "synchronize": true,
  "logging": false,
  "entities": [
     "dist/entity/**/*.js" <- ここが変わってる
  ],
  "migrations": [
     "src/migration/**/*.ts"
  ],
  "subscribers": [
     "src/subscriber/**/*.ts"
  ]
}

うまく動いた!

typescriptになれてる人ならハマらないのかな?

こういうconfig系で何度も躓くので、実践的なtsプロジェクトの作り方とか落ち着いたらまとめます。

Ishidall
何でも屋さんになりつつある。サーバーサイドを中心から全体に染み出している。Node.jsとAngular1系、Vue.js、Express.jsに慣れている。CSS雰囲気で書くマン。ML/DL回りを勉強したくて転職したが、なぜかSwift書く必要がでてきた上に最終的にはTypeScriptを書いていたので辞めて起業しました。結局TS書いてる問題が常に勃発。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away