我正在组建一个具有受保护部分的站点,用户必须登录才能访问.我在Laravel 4中完成了这个,没有太多事故.然而,对于我的生活,我无法弄清楚为什么我不能让它在Laravel 5(L5)中工作.
在L5中,中间件被引入.这会将路径文件更改为:
Route::get('foo/bar', ['middleware'=>'auth','FooController@index']);
Route::get('foo/bar/{id}', ['middleware'=>'auth','FooController@show']);
Run Code Online (Sandbox Code Playgroud)
只要不包含中间件,路由就可以正常工作.
当使用中间件访问路由时,结果并不是那么有趣.
哎呀,看起来像出事了.
Route.php第150行中的ReflectionException:
Function()不存在
非常感谢任何见解,帮助和/或帮助.我已经完成了Google电路,找不到任何与我当前困境有关的内容.提前致谢.
我想在输入网址时检查我的网络应用用户的授权.但是,当我使用单独的中间件来检查授权时,它对已有的路由没用,例如:
function authChecker(req, res, next) {
if (req.session.auth) {
next();
} else {
res.redirect("/auth");
}
}
app.use(authChecker);
app.get("/", routes.index);
app.get("/foo/bar", routes.foobar);
Run Code Online (Sandbox Code Playgroud)
该authChecker是unabled检查谁进入两个URL的用户的权限.它仅适用于未指定的URL.
我看到了一种方法,我可以将authChecker放在路由和路由处理程序之间,例如:
app.get("/", authChecker, routes.index);
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能以简单的方式实现它,而不是将authChecker放在每个路径中?
我有一个看起来像这样的Rack应用程序:
class Foo
def initialize(app)
@app = app
end
def call(env)
env["hello"] = "world"
@app.call(env)
end
end
Run Code Online (Sandbox Code Playgroud)
将我的Rack应用程序挂钩到Rails后,如何env["hello"]从Rails中获取访问权限?
更新:感谢Gaius的回答.Rack和Rails允许您在请求期间或会话持续时间内存储内容:
# in middleware
def call(env)
Rack::Request.new(env)["foo"] = "bar" # sticks around for one request
env["rack.session"] ||= {}
env["rack.session"]["hello"] = "world" # sticks around for duration of session
end
# in Rails
def index
if params["foo"] == "bar"
...
end
if session["hello"] == "world"
...
end
end
Run Code Online (Sandbox Code Playgroud) 在升级到Express 4并删除app.router后,我很难在路由执行后让中间件执行.
例如,以下代码正确响应"hello",但从不调用配置的中间件
var express = require( "express" )();
express.get( "/", function( req, res ) {
res.send( "hello" );
} );
express.use( function( req, res, next ) {
console.log( "world" );
next();
} );
express.listen( 8888 );
Run Code Online (Sandbox Code Playgroud)
澄清:
以下代码在控制台上显示"之前",但不是"之后":
var express = require( "express" )();
express.use( function( req, res, next ) {
console.log( "before" );
next();
} );
express.get( "/", function( req, res ) {
res.send( "hello" );
} );
express.use( function( req, res, next ) {
console.log( "after" ); …Run Code Online (Sandbox Code Playgroud) 众所周知,ASP.NET Core中方法Configure(类Startup)的IApplicationBuilder需要特定的语义(使用HttpContext类型的输入参数和作为返回值的Task的方法'Invoke').但为什么它没有作为接口实现?我可以写类似的东西:
public class FakeMiddleware
{
}
Run Code Online (Sandbox Code Playgroud)
并注册:
app.UseMiddleware<FakeMiddleware>();
Run Code Online (Sandbox Code Playgroud)
我们会得到一个运行时错误.当然,它是微不足道的东西,易于找到和修复,但它实现如此粗糙,没有界面?
我已经阅读了 FastAPI 关于中间件的文档(特别是中间件教程、CORS 中间件部分和高级中间件指南),但找不到如何编写可以使用该add_middleware函数添加的中间件类的具体示例(相反到使用装饰器添加的基本中间件功能),也不在此站点上。
我更喜欢使用add_middleware基于应用程序的装饰器的原因是,我想在共享库中编写一个中间件,该库将由多个不同的项目使用,因此我无法将其绑定到特定实例FastAPI。
所以我的问题是:你是如何做到的?
我正在尝试使用gulp和browser-sync重定向我的API请求:
gulp.task('browser-sync', function () {
var files = [
'../index.html',
'../views/**/*.html',
'../assets/css/**/*.css',
'../assets/js/**/*.js'
];
var url = require('url'),
proxy = require('proxy-middleware');
var proxyOptions = url.parse('http://localhost:8000/api');
proxyOptions.route = '/api';
browserSync.init(files, {
server: {
baseDir: '..',
middleware: [proxy(proxyOptions)]
}
});
});
Run Code Online (Sandbox Code Playgroud)
但是当我向API发送一个调用时,我得到了这个响应:
Error: connect ECONNREFUSED
at errnoException (net.js:904:11)
at Object.afterConnect [as oncomplete] (net.js:895:19)
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么的任何想法?
我正在寻找的功能类似于rake middlewareRails中的命令,但通用机架应用程序除外.
我开始使用Express JS并遇到了一个问题.我似乎无法弄清楚处理错误的正确方法.
例如,我有一个Web服务API,它提供一个名为"event"的对象.当用户提交未找到的事件ID时,我想返回一个简单的"无法查找事件"字符串.以下是我目前正在构建代码的方式:
app.get('/event/:id', function(req, res, next) {
if (req.params.id != 1) {
next(new Error('cannot find event ' + req.params.id));
}
req.send('event found!');
});
Run Code Online (Sandbox Code Playgroud)
当我提交1以外的ID时,Node会崩溃并输出以下内容:
http.js:527
throw new Error("Can't set headers after they are sent.");
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
at [object Object].<anonymous> (fs.js:107:5)
at [object Object].emit (events.js:61:17)
at afterRead (fs.js:878:12)
at wrapper (fs.js:245:17)
Run Code Online (Sandbox Code Playgroud)
从我通过使用node.js 调试器可以看出,在next()调用后继续执行代码块,这意味着req.send('event found!')尝试运行.我不希望这种情况发生.
我发现的唯一解决方法是简单地抛出一个new Error()而不是"next-ing"它,但这会导致生成默认的Express …
我正在laravel5中编写一个中间件,我希望通过中间件的代码403通过禁止的异常.我的中间件功能如下.
use Exception;
public function handle($request, Closure $next)
{
if (!Auth::check()) {
throw new Exception("Access denied", 403);
}
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
我从控制器调用中间件,我收到代码500但不是403的错误消息.我怎么解决这个问题?