javascript - Mogu li dinamički uvesti TypeScript module u Node.js/Express?


Imam Node.js poslužitelj izgrađen s Express.js i kodiran u TypeScriptu. Evo isječka get poziva za moj poslužitelj:

server.ts

private get(req: Request, res: Response, next: NextFunction, objectName: string) {
    var DatabaseObject = require("./models/" + objectName + ".js")(this.orm, Sequelize.DataTypes);
    var Transform = require("./routes/" + objectName + ".js");
    var transform = new Transform();

    // ...

    console.log(req.query["columns"]);
    console.log(transform.columnWhitelist);
    console.log(transform);

    // ...

    if (transform.columnWhitelist) {
        console.log("Column Whitelist Exists.");
    }
    // ...
}

Dinamički učitava Sequelize modul za objekt baze podataka koji se traži u URL-u, a zatim pokušava učitati TypeScript modul s pravilima o tome koje stupce je moguće odabrati, na kojima stupcima se može upitavati itd. Evo početka mog razreda pravila:

račun.ts

export default class Transform {
    static columnWhitelist : Object = {"id": "id", "name": "name", "parentAccountId":"parentAccountId", "masterAccountId":"masterAccountId"};

    constructor() { }
}

Međutim, pokretanjem moje aplikacije dobivam:

id,name,parentAccountId
undefined
{ default: 
   { [Function: Transform]
     columnWhitelist: 
      { id: 'id',
        name: 'name',
        parentAccountId: 'parentAccountId',
        masterAccountId: 'masterAccountId' } } }

Pozivajući transform.columnWhitelist, dobivam undefined, unatoč tome što ga također vidim u generiranoj JavaScript datoteci. Također sam pokušao samo:

    var transform = require("./routes/" + objectName + ".js");

Ili :

    var transform = require("./routes/" + objectName + ".js")();

Ali niti jedno od ovoga također ne djeluje.

Odgovor #1

Ako imate commonjs kao modul u vašem tsconfig.json i klasu Transform izvezenu kao zadanu, vjerojatno biste je trebali uvesti kao

 var transform = require("./routes/" + objectName + ".js").default;

Odgovor #2

Ako ne želite koristiti

var transform = require("./routes/" + objectName + ".js").default;

Možete izvesti svoju klasu tako da

class Transform {
     static columnWhitelist: Object = {"id": "id", "name": "name", "parentAccountId": "parentAccountId", "masterAccountId": "masterAccountId"};

     constructor () {}
}

export = Transform;

Nakon toga možete opet raditi kao prije:

var transform = require ("./ routes /" + objectName + ".js");

Povezani članci