gpt4 book ai didi

javascript - 将对象传递给 Express 导出函数

转载 作者:行者123 更新时间:2023-12-02 21:32:12 24 4
gpt4 key购买 nike

我正在努力(和学习)我的 TypeScript 技能,尽管我遇到了一个问题:我有一个名为 Manager 的类,它包含并管理多个“子”管理器。在索引文件中,我通过创建实例并调用加载函数来加载管理器。加载所有“子”管理器时,会获取对主/唯一 Manager 实例的引用,这样它们就可以调用/使用其他“子”管理器。

但我希望能够从 REST API 端点的“子”管理器获取一些信息。这些端点通过路由加载:

index.ts

import "reflect-metadata";

import { createConnection } from "typeorm";
import { Request, Response } from "express";

import * as express from "express";
import * as bodyParser from "body-parser";

import { AppRoutes } from "./routes";
import { Manager } from "./manager";

createConnection().then(async (typeORMConnection) => {
const manager = new Manager();

manager.load().then(() => {
console.log("Manager has loaded all managers");

const expressApp = express();

expressApp.use(bodyParser.json());
expressApp.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();
});

// Loop over every route
AppRoutes.forEach((singleRoute) => {

// Generate Express route
expressApp[singleRoute.method](singleRoute.path, (request: Request, response: Response, next: Function) => {
singleRoute.action(request, response)
.then(() => next())
.catch((error) => next(error));
});
});

// Start Express app
expressApp.listen(3000);

console.log("Express application is up and running on port 3000");
});
}).catch((error) => console.log(`TypeORM connection error: ${error}`));

路由文件如下所示:

routes.ts

import { getSpeakerById, getSpeakerAll } from "./controller/get";
import { enableSpeakerById, disableSpeakerById } from "./controller/put";

export const AppRoutes = [
{
path: "/speaker",
method: "get",
action: getSpeakerAll
},
{
path: "/speaker/:id",
method: "get",
action: getSpeakerById
},
{
path: "/speaker/:id/disable",
method: "put",
action: disableSpeakerById
},
{
path: "/speaker/:id/enable",
method: "put",
action: enableSpeakerById
},
];

最后但并非最不重要的一点是,这是一个包含实际逻辑的 Express 端点文件:

controller/get.ts

import { Request, Response } from "express";
import { getManager } from "typeorm";

import { Speaker } from "../entity/Speaker";

const ping = require("ping");

export async function getSpeakerById(request: Request, response: Response) {
const speakerRepository = getManager().getRepository(Speaker);
const speakerObject = await speakerRepository.findOne(request.params.id);

// If no post is found return 404
if (!speakerObject) {
response.status(404);
response.send("Speaker doesn't exist");
response.end();
return;
}

// Ping speaker and bind the time once its been resolved
speakerObject.time = await ping.promise.probe(speakerObject.host);

response.send(speakerObject);
}

export async function getSpeakerAll(request: Request, response: Response) {
const speakerRepository = getManager().getRepository(Speaker);
const speakerObjects = await speakerRepository.find();
const speakerPromise = [];

// Create a promise array of pings to all speakers
speakerObjects.forEach((speakerObject) => speakerPromise.push(ping.promise.probe(speakerObject.host)));

const speakerResults = await Promise.all(speakerPromise);

// Since the promise array is based on order we can rebind the property by looping over it in the same order
speakerResults.forEach((speakerResult, speakerIndex) => speakerObjects[speakerIndex].time = speakerResult.time);

response.send(speakerObjects);
}

现在我需要访问 controller/get.ts 中的主 Manager 实例,但我无法将其作为参数传递(据我所知),因为它是导出。我只需导入 Manager 类并创建一个新实例,但我只想启动 Manager 一次,因为它包含来自 Sonos 的间隔和扬声器实例等逻辑。包裹。我希望我能够解释这个问题,但如果有人需要澄清某些事情,我会更新帖子。

最佳答案

您实际上可以将它作为参数传递。没有什么可以阻止您在 index.ts 中执行类似的操作:

// Generate Express route
expressApp[singleRoute.method](singleRoute.path, (request: Request, response: Response, next: Function) => {
singleRoute.action(request, response, manager)
.then(() => next())
.catch((error) => next(error));
});
});

然后更新导出的 Controller 方法上的签名,如下所示

import { Manager } from '../manager';

export async function getSpeakerById(request: Request, response: Response, manager: Manager) {
...
}

关于javascript - 将对象传递给 Express 导出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60592899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com