【问题标题】:Return promise from Koa controller action with error从 Koa 控制器操作返回承诺,但有错误
【发布时间】: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


    【解决方案1】:

    答案在错误消息中。 你必须创建 Book 类的实例,使用 new

    const book = new Book();
    

    【讨论】:

      【解决方案2】:
      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 new Book.findAll();
          }
      }
      

      无法正常工作:

      TSError: ⨯ 无法编译 TypeScript: src/controllers/BookController.ts(8,16):错误 TS2350:只有一个 void 函数可以用'new'关键字调用。

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 2016-07-27
        • 2019-06-20
        • 1970-01-01
        • 2019-07-30
        • 2015-12-02
        • 2018-04-08
        • 2017-05-22
        • 1970-01-01
        相关资源
        最近更新 更多