TypeScript Typeorm节点模块导入错误:SyntaxError:意外令牌{

时间:2019-03-04 21:43:36

标签: javascript node.js typescript typeorm

我正在尝试使用带有Express和Typeorm的TypeScript创建项目。

在使用node dist/index.js进行编译后,尝试使用tsc运行服务器时,始终出现以下错误。

> typescript-express-boilerplate@1.0.0 start /home/yusta/Desktop/project
> npm run serve


> typescript-express-boilerplate@1.0.0 serve /home/yusta/Desktop/project
> node dist/index.js

Example index listening on port 3000!
/home/yusta/Desktop/project/src/entity/User.ts:1
(function (exports, require, module, __filename, __dirname) { import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
                                                                     ^

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)

有趣的是,运行ts-node src/index.ts可以正常工作:

Example index listening on port 3000!
Saved a new user with id: 2
Loading users from the database...
Loaded users:  [ User { id: 2, email: 'hello@hello.com', password: 'password' } ]

我认为tsconfig.json存在问题,但是我已经将module设置为commonjs,如下所示。

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es2018",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": [
        "node_modules/*",
        "src/types/*"
      ]
    },
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
  },
  "include": [
    "src/**/*"
  ]
}

package.json

{
  "name": "typescript-express-boilerplate",
  "version": "1.0.0",
  "description": "Boilerplate project for TypeScript with ExpressJS.",
  "engines": {
    "node": "10.x"
  },
  "scripts": {
    "start": "npm run serve",
    "serve": "node dist/index.js",
    "build": "npm run tslint && npm run build:ts",
    "build:ts": "tsc",
    "dev": "concurrently -k -p \"[{name}]\" -n \"TypeScript,Node\" -c \"cyan.bold,green.bold\" \"npm run watch:ts\" \"npm run watch:node\"",
    "watch:node": "nodemon dist/index.js",
    "watch:ts": "tsc -w",
    "tslint": "tslint -c tslint.json -p tsconfig.json",
    "heroku-postbuild": "npm install && npm run build"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "express": "^4.16.4",
    "oauth2orize": "^1.11.0",
    "passport": "^0.4.0",
    "passport-http-bearer": "^1.0.1",
    "pg": "^7.8.1",
    "reflect-metadata": "^0.1.13",
    "typeorm": "^0.2.14"
  },
  "devDependencies": {
    "@types/express": "^4.16.1",
    "@types/node": "^11.10.4",
    "@types/oauth2orize": "^1.8.5",
    "@types/passport": "^1.0.0",
    "@types/passport-http-bearer": "^1.0.33",
    "concurrently": "^4.1.0",
    "nodemon": "^1.18.10",
    "tslint": "^5.13.0",
    "typescript": "^3.3.3333"
  }
}

index.ts

import "reflect-metadata";
import express from "express";
import { createConnection } from "typeorm";
import { User } from "./entity/User";

createConnection().then(async connection => {
    const user = new User();
    user.email = "hello@hello.com";
    user.password = "password";
    await connection.manager.save(user);
    console.log("Saved a new user with id: " + user.id);

    console.log("Loading users from the database...");
    const users = await connection.manager.find(User);
    console.log("Loaded users: ", users);
}).catch(error => console.log(error));

// Create a new express application instance
const app: express.Application = express();

app.get("/", function (req: express.Request, res: express.Response) {
    res.send("Hello World!");
});

app.listen(process.env.PORT || 3000, function () {
    console.log("Example index listening on port 3000!");
});

实体/User.ts

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        length: 30
    })
    email: string;

    @Column()
    password: string;
}

谢谢。

编辑:

已编译的JavaScript代码没有ES6导入语句,它使用commonjs模块:

index.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
const express_1 = __importDefault(require("express"));
const typeorm_1 = require("typeorm");
const User_1 = require("./entity/User");
typeorm_1.createConnection().then(async (connection) => {
    const user = new User_1.User();
    user.email = "hello@hello.com";
    user.password = "password";
    await connection.manager.save(user);
    console.log("Saved a new user with id: " + user.id);
    console.log("Loading users from the database...");
    const users = await connection.manager.find(User_1.User);
    console.log("Loaded users: ", users);
}).catch(error => console.log(error));
// Create a new express application instance
const app = express_1.default();
app.get("/", function (req, res) {
    res.send("Hello World!");
});
app.listen(process.env.PORT || 3000, function () {
    console.log("Example index listening on port 3000!");
});
//# sourceMappingURL=index.js.map

实体/User.js

"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
const typeorm_1 = require("typeorm");
let User = class User {
};
__decorate([
    typeorm_1.PrimaryGeneratedColumn(),
    __metadata("design:type", Number)
], User.prototype, "id", void 0);
__decorate([
    typeorm_1.Column({
        length: 30
    }),
    __metadata("design:type", String)
], User.prototype, "email", void 0);
__decorate([
    typeorm_1.Column(),
    __metadata("design:type", String)
], User.prototype, "password", void 0);
User = __decorate([
    typeorm_1.Entity()
], User);
exports.User = User;
//# sourceMappingURL=User.js.map

2 个答案:

答案 0 :(得分:0)

在项目根目录(靠近package.json)中创建ormconfig.json。它应具有以下内容:

{
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "test",
    "password": "test",
    "database": "test"
}

答案 1 :(得分:0)

如果要在Node.js中运行代码,则需要告诉Typescript将ES模块语法转换为CommonJS。在您的tsconfig中:

"module": "commonjs",