Javascript 传递对象以表示导出函数
虽然我遇到了一个问题,但我正在学习打字技巧:我有一个名为Javascript 传递对象以表示导出函数,javascript,typescript,express,node-modules,Javascript,Typescript,Express,Node Modules,虽然我遇到了一个问题,但我正在学习打字技巧:我有一个名为Manager的类,它包含并管理多个“子”管理器。在索引文件中,我通过创建一个实例并调用load函数来加载管理器。当加载所有“子”管理器时,会获得对主/仅管理器实例的引用,这样他们就可以调用/使用其他“子”管理器 但我希望能够从RESTAPI端点的“子”经理那里获得一些信息。这些端点通过路由加载: 索引 路由文件如下所示: 路线 最后但并非最不重要的是,这是一个包含实际逻辑的Express endpoint文件: 控制器/get.ts 现在
Manager
的类,它包含并管理多个“子”管理器。在索引文件中,我通过创建一个实例并调用load函数来加载管理器。当加载所有“子”管理器时,会获得对主/仅管理器
实例的引用,这样他们就可以调用/使用其他“子”管理器
但我希望能够从RESTAPI端点的“子”经理那里获得一些信息。这些端点通过路由加载:
索引
路由文件如下所示:
路线
最后但并非最不重要的是,这是一个包含实际逻辑的Express endpoint文件:
控制器/get.ts
现在我需要访问
控制器/get.ts
中的主管理器实例,但我无法将其作为参数传递(据我所知),因为它是一个导出。我只想导入Manager类并创建一个新实例,但我只想启动Manager一次,因为它包含包中的逻辑,例如interval和speaker实例。我希望我能解释这个问题,但如果有人需要澄清什么,我会更新帖子。你可以把它作为一个参数传递。没有任何东西可以阻止您在索引中执行类似的操作。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));
});
});
然后在导出的控制器方法上更新签名,如下所示
import { Manager } from '../manager';
export async function getSpeakerById(request: Request, response: Response, manager: Manager) {
...
}
在索引文件中,我通过创建一个实例并调用加载函数来加载管理器
您可以将执行此操作的代码添加到index.ts中吗?@rh16我已经更新了index.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);
}
// 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));
});
});
import { Manager } from '../manager';
export async function getSpeakerById(request: Request, response: Response, manager: Manager) {
...
}