Вернуть обещание от действия контроллера Koa с ошибкой - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь построить REST API с помощью Typescript, Koa и Sequelize.Это довольно просто и имеет только app.ts в качестве точки входа, один контроллер и одну модель.

Я получаю сообщение об ошибке, когда пытаюсь вернуть Promise (данные из БД) из действия:

"TypeError: конструктор класса Book не может быть вызван без 'new' \ n в _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 at _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n at TransformOperationExecutor.transform (/production/data/node_modules/class-transformer/Transformjsecec: 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 at _loop_1 (/production/data/src/TransformOperationExecutor.ts:167:43)\n в TransformOperationExecutor.transform (/ production / data / node_modules / class-transformer / TransformOperationExecutor.js: 178: 17) \ n в /production/data/src/TransformOperationExecutor.ts:43:40\n в 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 "Blockquote

Вот мой 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"
}

.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, я пытаюсь вернуть обещание (как я прочитал в документации ) и получил ошибку.Итак, что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
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: только пустота функцию можно вызывать с помощью ключевого слова «new».

0 голосов
/ 18 ноября 2018

Ответ в сообщении об ошибке.Вы должны создать экземпляр класса Book, используя new

const book = new Book();
...