如何防止装饰器在TypeScript中导入节点模块?

杰克·墨菲

我正在尝试使用Typescript中的typeorm库在TypeScript 2 Express服务器和Angular 2之间创建DTO / DAO模式。

为了简便起见,我称这些对象为DTO,但它们只是一堆字段和注释。

import {autoserialize} from "cerialize";
import {DTOReport} from "./reports.dto";

import { PrimaryGeneratedColumn} from "typeorm/decorator/columns/PrimaryGeneratedColumn"
import { CreateDateColumn } from "typeorm/decorator/columns/CreateDateColumn";
import { Column } from "typeorm/decorator/columns/Column";
import { JoinColumn } from "typeorm/decorator/relations/JoinColumn";
import { OneToOne } from "typeorm/decorator/relations/OneToOne";
import { ManyToOne } from "typeorm/decorator/relations/ManyToOne";
import { OneToMany } from "typeorm/decorator/relations/OneToMany";
import { Table } from "typeorm/decorator/tables/Table";
import { ColumnTypes } from "typeorm/metadata/types/ColumnTypes";

@Table()
export class DTOSourceFile {
  @PrimaryGeneratedColumn()
  @autoserialize
  id: number;

  @Column()
  @autoserialize
  locationURL: string;

  @CreateDateColumn()
  @autoserialize
  createdAt: Date;

  @OneToMany(type => DTOReport, report => report.source, {nullable: true})
  @autoserialize report: DTOReport;
  @autoserialize reportId: number;

  @Column(ColumnTypes.TEXT)
  @autoserialize
  originalname: string;

  @Column(ColumnTypes.JSON)
  @autoserialize
  mutler: string;
}

我正在仔细地仅导入装饰器。但是,在编译时,我看到一个请求返回到根index.ts文件。

"use strict";
const ColumnTypes_1 = require("../../metadata/types/ColumnTypes");
const ColumnTypeUndefinedError_1 = require("../error/ColumnTypeUndefinedError");
const index_1 = require("../../index");  // < --- THIS
const PrimaryColumnCannotBeNullableError_1 = require("../error/PrimaryColumnCannotBeNullableError");
/**
 * Column decorator is used to mark a specific class property as a table column.
 * Only properties decorated with this decorator will be persisted to the database when entity be saved.
 * Primary columns also creates a PRIMARY KEY for this column in a db.
 */
function PrimaryColumn(typeOrOptions, options) {
    let type;
    if (typeof typeOrOptions === "string") {
        type = typeOrOptions;
    }
    else {
        options = typeOrOptions;
    }
    return function (object, propertyName) {
        const reflectedType = ColumnTypes_1.ColumnTypes.typeToString(Reflect.getMetadata("design:type", object, propertyName));
        // if type is not given implicitly then try to guess it
        if (!type)
            type = ColumnTypes_1.ColumnTypes.determineTypeFromFunction(Reflect.getMetadata("design:type", object, propertyName));
        // if column options are not given then create a new empty options
        if (!options)
            options = {};
        // check if there is no type in column options then set type from first function argument, or guessed one
        if (!options.type)
            options = Object.assign({ type: type }, options);
        // if we still don't have a type then we need to give error to user that type is required
        if (!options.type)
            throw new ColumnTypeUndefinedError_1.ColumnTypeUndefinedError(object, propertyName);
        // check if column is not nullable, because we cannot allow a primary key to be nullable
        if (options.nullable)
            throw new PrimaryColumnCannotBeNullableError_1.PrimaryColumnCannotBeNullableError(object, propertyName);
        // implicitly set a primary to column options
        options = Object.assign({ primary: true }, options);
        // create and register a new column metadata
        const args = {
            target: object.constructor,
            propertyName: propertyName,
            propertyType: reflectedType,
            mode: "regular",
            options: options
        };
        index_1.getMetadataArgsStorage().columns.add(args); // < --- THIS
    };
}
exports.PrimaryColumn = PrimaryColumn;

//# sourceMappingURL=PrimaryColumn.js.map

Angular 2的webpack编译器产生的错误清楚地显示了问题,然后尝试加载节点依赖项。

WARNING in ./~/typeorm/driver/sqlserver/SqlServerDriver.js
Module not found: Error: Can't resolve 'mssql' in '/Users/jmurphy/projects/ubq/web/node_modules/typeorm/driver/sqlserver'
 @ ./~/typeorm/driver/sqlserver/SqlServerDriver.js 256:25-41
 @ ./~/typeorm/connection/ConnectionManager.js
 @ ./~/typeorm/index.js
 @ ./~/typeorm/decorator/columns/PrimaryGeneratedColumn.js
 @ ./src/app/dtos/lens.dto.ts
 @ ./src/app/lens/lens.component.ts
 @ ./src/app/app.module.ts
 @ ./src/app/index.ts
 @ ./src/main.ts
 @ multi main
Child html-webpack-plugin for "index.html":
         Asset     Size  Chunks       Chunk Names
    index.html  2.88 kB       0
webpack: bundle is now VALID.

有没有办法允许TypeORM装饰器存在于浏览器项目中而无需尝试加载节点依赖项?

链接:

TypeORM来源:https : //github.com/typeorm/typeorm/blob/master/src/decorator/columns/PrimaryColumn.ts

雷莫·J·詹森

我认为该库并非旨在在Web浏览器中工作,但也许有解决方案。装饰器使用在getMetadataArgsStorage处声明函数/index.ts/index.ts进口很多东西都是导致你的问题。

您可以在此处看到getMetadataArgsStorage函数如何使用defaultContainerMetadataArgsStorage

如果getMetadataArgsStorage已从移至index.ts新文件,则可能对您有用,但您需要将PR发送至GitHub上的项目。

问题是这一行,因为ConnectionManager导入了所有驱动程序:

import * as fs from "fs";
import {Connection} from "./Connection";
import {ConnectionNotFoundError} from "./error/ConnectionNotFoundError";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {ConnectionOptions} from "./ConnectionOptions";
import {DriverOptions} from "../driver/DriverOptions";
import {Driver} from "../driver/Driver";
import {MissingDriverError} from "./error/MissingDriverError";
import {PostgresDriver} from "../driver/postgres/PostgresDriver";
import {AlreadyHasActiveConnectionError} from "./error/AlreadyHasActiveConnectionError";
import {Logger} from "../logger/Logger";
import {SqliteDriver} from "../driver/sqlite/SqliteDriver";
import {OracleDriver} from "../driver/oracle/OracleDriver";
import {SqlServerDriver} from "../driver/sqlserver/SqlServerDriver";
import {OrmUtils} from "../util/OrmUtils";
import {CannotDetermineConnectionOptionsError} from "./error/CannotDetermineConnectionOptionsError";

/**
 * ConnectionManager is used to store and manage all these different connections.
 * It also provides useful factory methods to simplify connection creation.
 */
export class ConnectionManager {
// ...

我建议您向typeorm的作者解释您的用例。也许还要提到,如果不是默认情况下始终导入所有驱动程序,那将是一件好事。最好只加载所需的驱动程序(对于您而言,都不是)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章