【发布时间】:2019-04-21 04:52:48
【问题描述】:
我正在尝试使用 Typescript、Koa 和 Sequelize 构建 REST api。
它非常简单,只有app.ts 作为入口点、一个控制器和一个模型。
当我尝试从操作返回 Promise(来自 DB 的数据)时出现错误:
"TypeError: Class constructor Book cannot be invoked without 'new'\n at _loop_1 (/production/data/src/TransformOperationExecutor.ts:124:47)\n 在 TransformOperationExecutor.transform (/production/data/node_modules/ class-transformer/TransformOperationExecutor.js:178:17)\n 在 _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n 在 TransformOperationExecutor.transform (/production/data/node_modules/class-transformer/ TransformOperationExecutor.js:178:17)\n 在 _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n 在 TransformOperationExecutor.transform (/production/data/node_modules/class-transformer/TransformOperationExecutor.js: 178:17)\n 在 _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n 在 TransformOperationExecutor.transform (/production/data/node_modules/class-transformer/TransformOperationExecutor.js:178:17) \n 在 _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n 在 TransformOpera tionExecutor.transform (/production/data/node_modules/class-transformer/TransformOperationExecutor.js:178:17)\n at /production/data/src/TransformOperationExecutor.ts:43:40\n at Array.forEach ()\n在 TransformOperationExecutor.transform (/production/data/src/TransformOperationExecutor.ts:40:30)\n 在 ClassTransformer.classToPlain (/production/data/src/ClassTransformer.ts:21:25)\n 在 Object.classToPlain (/ production/data/src/index.ts:17:29)\n 在 KoaDriver.BaseDriver.transformResult (/production/data/src/driver/BaseDriver.ts:143:22)\n 在 KoaDriver.handleSuccess (/production/ data/src/driver/koa/KoaDriver.ts:222:23)\n 在 /production/data/src/RoutingControllers.ts:161:45" 块引用
这是我的 tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es2016",
"noImplicitAny": false,
"sourceMap": true,
"outDir": "dist",
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"exclude": [
"node_modules"
]
}
这是我的 package.json
{
"name": "name",
"version": "1.0.0",
"description": "description",
"scripts": {
"dev": "NODE_ENV=development nodemon dist/app.js"
},
"keywords": [
"node"
],
"author": "author",
"license": "ISC",
"dependencies": {
"reflect-metadata": "^0.1.12",
"koa": "^2.6.2",
"koa-bodyparser": "^4.2.1",
"koa-router": "^7.4.0",
"koa-multer": "^1.0.2",
"koa-static": "^5.0.0",
"routing-controllers": "^0.7.7",
"lodash": "^4.17.11",
"mysql2": "^1.6.4",
"sequelize": "^4.39.0",
"sequelize-typescript": "^0.6.6"
},
"devDependencies": {
"@types/koa": "^2.0.46",
"@types/koa-bodyparser": "^5.0.1",
"@types/koa-router": "^7.0.32",
"@types/koa-static": "^4.0.0",
"@types/lodash": "^4.14.116",
"@types/sequelize": "^4.27.26",
"nodemon": "^1.11.0",
"ts-node": "^7.0.1",
"typescript": "^3.1.1"
}
}
我还有 nodemon.json
{
"watch": ["src"],
"ext": "ts",
"exec": "ts-node ./src/app.ts"
}
App.ts
import "reflect-metadata";
import {createKoaServer} from "routing-controllers";
import {Sequelize} from 'sequelize-typescript';
const sequelize = new Sequelize({
host: '172.18.0.11',
database: 'notes',
dialect: 'mysql',
username: 'username',
password: 'root',
modelPaths: [__dirname + '/models']
});
const port = 20000;
createKoaServer({
controllers: [__dirname + "/controllers/*"]
}).listen(port);
console.log("Server running on port " + port);
在目录models 我有文件Book.ts
import {Table, Column, Model, HasMany} from 'sequelize-typescript';
@Table({tableName: 'Books'})
export class Book extends Model<Book> {
@Column
title: string;
@Column
author: string;
}
最后在目录controllers 我有文件BookController.ts
import {Get, JsonController, Post, Patch, Param, State, Delete} from "routing-controllers";
import {Book} from "../models/Book";
@JsonController("/api")
export class BookController {
@Get("/books")
getAll() {
return Book.findAll();
}
}
在这里,在BookController.ts 中,我尝试返回承诺(正如我在documentation 中看到的那样)并出现错误。那么,我做错了什么?
【问题讨论】:
标签: node.js typescript sequelize.js koa