roy*_*e41 2 c# httpcontext node.js express
我决定学习节点的最佳方法是在节点中重新构建我现有的一个c#/ webforms应用程序.
这是一个相当学习的曲线,我注意到我在c#中HttpContext.Current经常使用的一件事是访问类Session和Request.Url类或静态方法.
节点中有没有这样的东西我错过了?
我已将节点应用程序拆分为可重复使用的"类"(伪代码)
/api/
- user-manager.js
- getAllUsers()
Run Code Online (Sandbox Code Playgroud)
然后在我的一个控制器中
var userManager = require('user-manager');
var users = userManager.getAllUsers();
Run Code Online (Sandbox Code Playgroud)
现在,如果我想访问sessionManager或userManager中的url,我必须做这样的事情:
var users = userManager.getAllUsers(req, res);
Run Code Online (Sandbox Code Playgroud)
这不是一个大问题,但我只是好奇,如果有另一种方式,或者如果我构建我的应用程序完全错误,那么了解其他人如何做事情会很有见.
这是正常的.原因如下:
HttpConext.Current在Asp.net中工作是因为它能够将特定工作线程与数据相关联,在这种情况下是请求的整个上下文.这发生在页面生命周期的早期.代码总是可以通过这种方式询问"我的上下文是什么".
Nodejs在单个线程中运行JavaScript,与.NET使用的线程本地存储不相同.如果一次只处理一个请求,那么request和response值可以全局存储并从任何地方访问.
但是,正如您所知,NodeJ的效率来自于引擎通过在引擎控制的线程中执行异步工作而保持忙碌的事实.此外,由于许多异步操作都是IO,因此它们通常会等待IO操作的结果返回.在等待期间,引擎从队列中取出工作并执行它直到下一次异步操作.一般来说,很难预测接下来会从队列中执行什么代码.如果没有其他NodeJS功能,它将不知道正在执行的代码的上下文.
如果没有线程本地存储来管理状态,并且没有为正在提供的"现在"当前请求正确调整全局状态的能力,则引擎依赖于JavaScript闭包.它们捕获上下文和范围,并通过执行排队工作来保留,并在引擎将结果返回到代码块时进行恢复.有趣的是,微软在首次创建Asp.Net时可以使用匿名函数(参考),可能遵循与NodeJ类似的模式.
因此,在没有将当前JavaScript与原始请求进行某种关联的情况下,实际上并没有真正存储请求状态的地方.关闭是必要的.但是,在那一点上,您可能只是传递两个值,或将它们组合成一个context = { request : req, response : res }.根据需要传递值是正常的.
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |