你能提供一个WSGI start_response功能的真实例子吗?(Web服务器为wsgi应用程序提供该功能)
我无法理解引入的目的start_response.
(我喜欢阅读有关WSGI标准的10个相同的文本.他们都说"WSGI标准是......"他们没有说"WSGI设计这样才能 ......" :()
这个问题扩展了什么是Node.js的Connect,Express和"中间件"?
我正在学习Javascript - > Node.js - > Connect - > Express - > ...的路线,以便了解如何使用现代Web开发堆栈.我有低层网络的背景,所以开始使用Node.js net和http模块很容易.使用服务器将请求路由到不同处理程序的一般模式看起来自然而直观.
转向Connect,我恐怕我不理解这个"中间件"的范例和数据的一般流程.例如,如果我创建一些用于Connect ala的中间件;
// example.js
module.exports = function (opts) {
// ...
return function(req, res, next) {
// ...
next();
};
};
Run Code Online (Sandbox Code Playgroud)
并在Connect via中"使用"它
var example = require('./example');
// ...
var server = connect.createServer();
// ...
server.use(example(some_paramater));
Run Code Online (Sandbox Code Playgroud)
我不知道我的中间件何时被调用.另外,如果我正在使用use()其他middlware,我可以保证调用中间件的顺序吗?此外,我假设该函数next()用于调用下一个(再次,我如何建立一个排序?)中间件; 但是,没有传递参数(req,res,next).这些参数是否以某种方式隐式传递?
我猜测所使用的中间件模块的集合是串联起来的,从http回调开始- >因此在初始请求回调和服务器结束响应的过程中添加了一堆功能.
我试图理解中间件范例,以及信息/执行的流程.
任何帮助是极大的赞赏.谢谢你的阅读
由于不同的宝石如何在我的系统中相互作用,我将引擎安装到导轨应用程序上.我最近开始研究一种提供一些中间件功能的新gem.
有点像:
BaseApp
\
Engine
\
NewMiddlewareEngine
# BaseApp/Gemfile
gem 'Engine'
# Engine/Gemfile
gem 'NewMiddlewareEngine'
# rake middleware output:
user@laptop[BaseApp]$ bundle exec rake middleware
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x6ebf30e1>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use CatchJsonParseErrors
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run BaseApp::Application.routes
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法让NewMiddlewareEngine显示在中间件中.我测试了这个:
BaseApp
\
NewMiddlewareEngine
# BaseApp/Gemfile …Run Code Online (Sandbox Code Playgroud) 当我将中间件注册为请求管道的一部分时,如何通过中间件链传递数据.(最终可在MVC控制器操作中访问)
例如,我已经实现了自定义中间件来验证我的请求,但是如何在中间件链中传递身份验证数据(例如身份验证和其他数据的结果) - 最终希望从MVC控制器操作中访问数据,以及用于根据身份验证结果限制访问的自定义MVC操作过滤器.
有没有我可以在每个请求的基础上存储自定义数据,并在以后的请求链中访问它?
我想通过一个JsonResultAsp.Net Core中间件来回应,但是如何实现这一点并不明显.我用Google搜索了很多但收效甚微.我可以通过一个JsonResult全局来回应,通过IActionFilter设置ActionExecutedContext.Result到JsonResult那个很酷.但在这种情况下,我想JsonResult从我的中间件中有效地返回一个.怎么能实现呢?
我提出了关于问题的问题,JsonResult IActionResult但理想情况下,解决方案可以使用任何IActionResult来编写来自中间件的响应.
通过支持(C)Python和Java/JMS应用程序的消息代理进行通信的好方法是什么?我的特殊要求是:
我很难找到解决方案.Apache的ActiveMQ没有开箱即用的Python支持.ZeroMQ需要一个集合点.RabbitMQ似乎不支持JMS.我找到的最佳候选者是ActiveMQ和pyactivemq库的组合.但是pyactivemq的第一个也是最后一个版本是在2008年,所以看起来这不符合我的"无边缘"要求.
理想的答案是一个或多个支持良好且记录良好的开源软件包的名称,您个人习惯于在Java/JMS和Python应用程序之间进行通信,并且不需要进行大量的集成工作开始.答案包括"简单"(最多几天的工作)实施额外的胶水代码以满足上述所有要求,这是可以接受的.在没有良好的开源候选人的情况下,商业解决方案也是可以接受的.
此外,Jython已经出局了.(如果我能......)相同的Python应用程序将需要使用仅在CPython中可用的模块.
我想创建一种前置过滤器,它允许我在所有操作中使当前用户可用.followint方法运行良好,我甚至不需要声明一个全局变量:
app.use(function(req, res, next){
if(req.session.user_id){
/* Get user from database
and share it in a variable
that can be accessed frooom ...
*/
User.find({ /* ... */ }, function(err, users){
if(users.length == 1){
req.current_user = users[0];
}
next();
});
}
else{
next();
}
});
app.get('/', function(req, res){
// ... here!!
console.log(req.current_user);
res.render('index', {
current_user: req.current_user,
});
});
Run Code Online (Sandbox Code Playgroud)
但是我仍然不确定是否可以操纵,req因为我不知道改变一些不属于我的东西是否正确?有一个更好的方法吗?
在Mongoose文档中建议我应该能够使用插入"init"钩子的中间件来控制流程.
但是,到目前为止,我只能通过"保存"和"验证"获得成功.
当我做这样的事情时,这些中间件都不会被调用:
MySchema.post( "init", function (next) { console.log("post init") });
MySchema.pre( "init", function (next) { console.log("pre init") });
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我正在尝试为Laravel中的中间件编写单元测试.有没有人知道一个教程,或有一个这样的例子?
我一直在编写很多代码,但必须有更好的方法来测试handle方法.
(我已经这样做了fbStrategy.passReqToCallback = true)我正在关注
https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together但是想要为多个应用程序使用这种社交认证服务,例如:控制它的那个加热系统,打开喷头等的系统
基本上,如果其中一个应用程序检查服务器并且没有正确的令牌,它将被重定向到此社会认证服务(social-auth).当用户按下社交登录按钮时,它会抓取其来自的应用程序的参数,并将其作为参数添加/auth/facebook/:appid
// send to facebook to do the authentication
app.get('/auth/facebook/:appId', function(req,res,next){
passport.authenticate(
'facebook', { scope : 'email' }
)(req,res,next);
});
Run Code Online (Sandbox Code Playgroud)
req的req,res,next是序列化的用户记录.此时,社交认证并不知道用户是谁.
fbStrategy.passReqToCallback = true;
passport.use(new FacebookStrategy(fbStrategy,
function(req, token, refreshToken, profile, done) {
var email = (profile.emails[0].value || '').toLowerCase()
process.nextTick(function() {...
Run Code Online (Sandbox Code Playgroud)
一旦授权完成,我想重定向回调用应用程序,我需要参加这个:appId参数,所以我可以回到正确的网站.
现在一般情况下,如果我只是创建了一个变量,currentAppId可以访问各种社交状态,但如果您碰巧有多个人同时进行身份验证,那么您可能会让用户返回错误的应用程序,或其他一些用户应用程序.这就是为什么我需要appId作为param旅行passport.authenticate.我应该在哪里找出方法.我能包装passport.authenticate或以其他方式修改东西吗?
middleware ×10
node.js ×4
asp.net-core ×2
express ×2
python ×2
asp.net-mvc ×1
c# ×1
connect ×1
java ×1
javascript ×1
json ×1
laravel-5 ×1
mongodb ×1
mongoose ×1
passport.js ×1
ruby ×1
unit-of-work ×1
unit-testing ×1
web-services ×1
wsgi ×1