在控制器中使用api请求头的有效方式,在Node Express Js中使用模型



我对NodeJS非常陌生。我们确实需要使用从路由器到模型类的请求标头。让我们假设一个简单的路由器

router.ts
router.delete(
'/sample/:id',
validateRequest(),
async function (req: Request, res: Response, next: NextFunction) {
try {
const solution: string = req.header('Some Header Value') || '';
await Controller.someMethods(req.params.id, solution);
return res.json(new HttpResponse('SUCCESS', {}, {}));
} catch (err) {
return next(err);
}
},
);

这是我们的路由器,在这里我们应该能够读取";解决方案";在控制器、服务和模型类中。现在,我们已经将它作为一个参数传递给不同的组件。有没有更好的方法来读取当前请求范围内的头值?类似地,使用spring框架中的组件,或sesison管理或任何其他更好的方法,而不是在每个组件级别将头值作为参数传递。

问候Eresh

TL;DR;除了手动映射之外,没有其他方法。

Express是非常极简主义的,所以我们没有像Spring这样的抽象,事实是Node.js与Java不同。在Java中,我们为每个请求生成一个线程,因此每个请求都有一个线程。Node.js是异步和单线程的,因此多个请求共享同一个线程,因此您需要在调用中传递这些值,因为在存储请求的全局值方面没有现成的解决方案。

如果你想在应用程序中的某个地方访问标头,你可以构建一个这样做的系统。第一步是添加中间件,该中间件将标头存储在服务中,并使用与之相关的唯一ID,并以某种方式传递该ID。然后,只要你知道ID,你就可以打电话给服务部门为你获取数据,尽管你仍然需要在路上传递ID。我认为你不应该在意这些,这没关系。我会以Controller方法访问reqres的方式重构代码,然后使用这些对象的所有逻辑都将在这里封装,而服务层将期望对控制器操作的传输层一无所知的原始数据。因此,您可以从另一个服务调用服务,因为它们对请求和响应一无所知。

FWIW,如果你需要一个更好的框架,可以使用Nest.js,它很棒,也很高级,而且它使用了decorator(类似于Spring中的注释(。例如,您可以通过以下方式@Header("some-header") solution: string将头值作为方法的调用参数注入

致以最良好的问候。

相关内容

最新更新