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");
