簡體   English   中英

TypeScript Typeorm 節點模塊導入錯誤:SyntaxError: Unexpected token {

[英]TypeScript Typeorm Node module import error: SyntaxError: Unexpected token {

我正在嘗試使用帶有 Express 和 Typeorm 的 TypeScript 創建一個項目。

在使用tsc編譯后嘗試使用node dist/index.js運行服務器時,我不斷收到以下錯誤。

> 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 ,如下所示。

配置文件

{
  "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/**/*"
  ]
}

包.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"
  }
}

索引.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!");
});

實體/用戶.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 模塊:

索引.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

實體/用戶.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

在項目根目錄(package.json 附近)創建ormconfig.json 它應該有以下內容:

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

如果你想在 Node.js 中運行你的代碼,你需要告訴 typescript 將 ES 模塊語法轉換為 CommonJS。 在您的 tsconfig 中:

"module": "commonjs",

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM