在我的 Node js 应用程序中,我在某些路由中使用函数作为中间件。我通常使用 res.locals 作为 afunction以免覆盖该res.locals对象。但现在我更新了nodejs并表达到最新版本,我不知道为什么我收到以下错误:
Unhandled rejection TypeError: res.locals is not a function\n at /home/jose/workspace/tfg/server.js:116:8\n at tryCatcher (/home/jose/workspace/tfg/node_modules/bluebird/js/release/util.js:11:23)\n at Promise._settlePromiseFromHandler (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:491:31)\n at Promise._settlePromise (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:548:18)\n at Promise._settlePromise0 (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:593:10)\n at Promise._settlePromises (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:672:18)\n at Async._drainQueue (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:125:16)\n at Async._drainQueues (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:135:10)\n at Immediate.Async.drainQueues [as _onImmediate] (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:16:14)\n at processImmediate [as _immediateCallback] (timers.js:383:17)\nRun Code Online (Sandbox Code Playgroud)\n\n这个中间件的作用如下所示:
\n\nfunction middle_datos (req, res, next){\n\n var id_usuario = req.user ? req.user._id : 'undefined';\n\n // object to override res.locals\n var variables_locales = {\n ip: IP,\n …Run Code Online (Sandbox Code Playgroud) 内核.php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'isSeller' =>App\Http\Middleware\IsSeller::class,
'isDealer' =>App\Http\Middleware\IsDealer::class,
];
Run Code Online (Sandbox Code Playgroud)
网页.php
Route::group(['middleware'=>['isDealer:verified']],function (){
Route::post("/doc_submit", "DealerController@docSubmit")->name('doc-submit');
});
Run Code Online (Sandbox Code Playgroud)
IsDealer.php
public function handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->isDealer() )
{
dd($request->route()->parameters()); // []
$notification_count = count(Notification::where('user_id','=', Auth::user()->id)->where('seen', '=', 0)->get());
View::share('notification', $notification_count);
return $next($request);
} else {
return GlobalController::AuthLoginPrompt("dealer");
}
}
Run Code Online (Sandbox Code Playgroud)
当他们尝试提交文档时,我需要检查该用户的用户帐户验证状态,我如何将参数传递给中间件?dd($request->route()->parameters()) return [], 我怎么能得到“验证”,因为我已经写了 ['middleware'=>['isDealer:verified']]
我制作了一个自定义中间件,现在我想访问解决方案中另一个项目中的应用程序设置。我是否应该将 IConfiguration 对象注入到中间件构造函数中,并添加 Microsoft.Extensions.Configuration 的 using 语句?或者有更好的方法来做到这一点吗?
我正在使用 Core 2.1 处理 ASP.net 网页。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using System;
using System.Threading.Tasks;
public class MyMiddleware
{
public IConfiguration _configuration;
public MyMiddleware(RequestDelegate next, IConfiguration config)
{
_next = next;
_ configuration = config;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 Pole Emploi 的 API,但 25 分钟后,当我的令牌过期时,我遇到了 401 错误。
我寻找一种获取新令牌并重试请求的方法,但我无法理解中间件的工作原理,以及我是否应该使用中间件来满足我的需求。
在 Guzzle 的文档上是这样写的:
中间件函数返回一个接受下一个要调用的处理程序的函数。然后,这个返回的函数返回另一个充当组合处理程序的函数——它接受请求和选项,并返回一个通过响应实现的承诺。您组合的中间件可以修改请求、添加自定义请求选项以及修改下游处理程序返回的 Promise。
这是文档中的示例代码:
use Psr\Http\Message\RequestInterface;
function my_middleware()
{
return function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
return $handler($request, $options);
};
};
}
Run Code Online (Sandbox Code Playgroud)
所以我认为我需要管理“承诺”以查看其HTTP代码是否为401,然后获取新令牌并重试请求?
我迷路了,所以如果有人能用不同的词向我解释这个逻辑,我将不胜感激:)
先感谢您。
我正在开发我的第一个节点应用程序。现在可以部署了,我想保护我的应用程序。所以我使用这些库来保护它。
import mongoSanitize from 'express-mongo-sanitize';
import helmet from 'helmet';
import xss from 'xss-clean';
import hpp from 'hpp';
import cors from 'cors';
import rateLimit from 'express-rate-limit';
Run Code Online (Sandbox Code Playgroud)
我想知道的是,我在这里复制东西吗?我必须使用所有这些库吗?这里的库是否做同样的事情,以便我可以通过从应用程序中删除不必要的中间件来删除它们以提高应用程序的性能?
如何使用在每个套接字事件而不是每个连接上触发的身份验证中间件?
我想将其用于反应节点应用程序中的会话管理。用户登录后,我将发送 JWT 令牌,并在数据库的会话表中创建一个新行。但是在他登录后,我想通过使用提到的中间件检查他是否是同一个人,以应对以下每个事件。前端客户端会通过cookies发送token。
我的登录和注销工作是通过 socket.io 而不是通过 HTTP 进行的。
我正在使用express它router来创建一个具有公共和私有路由的服务器。要访问私有路由,用户必须登录并发送JWT令牌。令牌很好,但我无法将用户重定向到私有路由。
const express = require('express');
const jwt = require('jsonwebtoken');
const authRouter = require('./auth');
const usersRouter = require('./users');
const router = express.Router();
router.use(authRouter);
const accessTokenSecret = '4-8-15-16-23-42';
const privateRoutes = ['/user'];
const checkPublicOrPrivate = (req, res, next) => {
privateRoutes.forEach(route => {
if (req.path.includes(route)) {
return authorization(req, res, next);
}
});
return next();
};
const authorization = (req, res, next) => {
const { token } = req.headers;
if (token) {
jwt.verify(token, accessTokenSecret, (err, user) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将管理员重定向到管理面板页面,将用户重定向到主页
我为用户类型创建了新字段,并在数据库中添加了“admin”值
$table->string('usertype')->nullable();
Run Code Online (Sandbox Code Playgroud)
然后我创建了这个中间件(AdminMiddleware):
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if(Auth::user()->usertype == 'admin')
{
return $next($request);
}
else
{
return redirect('/dashboard');
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到内核中:
'admin' => \App\Http\Middleware\AdminMiddleware::class,
Run Code Online (Sandbox Code Playgroud)
我将该函数添加到 RouteServiceProvider 并导入该类:
public const HOME = '/dashboard';
protected function redirectTo()
{
if(Auth::user()->usertype == 'admin')
{
return 'panel';
}
else …Run Code Online (Sandbox Code Playgroud) 设置中间件时出现以下错误。使用 Redux observable/Redux 工具包。关于为什么会发生这种情况有任何意见吗?
遵循以下回购协议设置。 https://github.com/beast911/react-redux-observables-typescript
import systemReducer, {
getInfoStart,
getInfoSuccess,
getInfoFailed,
addInfoStart,
addInfoSuccess,
addInfoFailed,
editInfoStart,
editInfoSuccess,
editInfoFailed,
deleteInfoStart,
deleteInfoSuccess,
deleteInfoFailed,
completeInfoStart,
completeInfoSuccess,
completeInfoFailed,
} from "./system/slice";
import {
combineReducers,
configureStore,
getDefaultMiddleware,
} from "@reduxjs/toolkit";
import { createBrowserHistory } from "history";
import { combineEpics, createEpicMiddleware } from "redux-observable";
import {
getInfoEpic,
addInfoEpic,
completeInfoEpic,
deleteInfoEpic,
editInfoEpic,
} from "./system/epics";
import { ActionType } from "typesafe-actions";
import {
connectRouter,
routerMiddleware,
RouterState,
} from "connected-react-router";
type SystemActionsWithPayload =
| typeof getInfoStart
| typeof …Run Code Online (Sandbox Code Playgroud) 我有一个使用 .NET Core 2.2 中间件的后端解决方案,并将其更新到 .NET Core 5,但InvokeAsync不再触发该方法。
这是我的代码:
\n启动(在configureservices中):
\napp.UseMiddleware<ValidRouteMiddleware>();\napp.UseMiddleware<ValidNuisAlgoTokenAndAdminMiddleware>();\napp.UseMiddleware<CheckIdChantierDefaultMiddleware>();\napp.UseMiddleware<ValidationCatcherMiddleware>();\nRun Code Online (Sandbox Code Playgroud)\n有效路由中间件:
\npublic class ValidRouteMiddleware\n{\n private readonly ILogger<ValidRouteMiddleware> _logger;\n private const string BadRouteErrorMessage = "Hello World d~.~b";\n private readonly RequestDelegate _next;\n private readonly List<string> _allRoutes;\n\n public ValidRouteMiddleware(RequestDelegate next, ILogger<ValidRouteMiddleware> logger,\n IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)\n {\n _next = next;\n _logger = logger;\n ....\n }\n\n public async Task InvokeAsync(HttpContext context)\n {\n if (!MiddlewareTools.CheckRoute(context,_allRoutes))\n {\n _...\n return;\n }\n else\n {\n await _next.Invoke(context);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nCheckIdChantierDefaultMiddleware:
\n public …Run Code Online (Sandbox Code Playgroud) 我有一个使用快速生成器生成的应用程序,带有bin/www文件和app.js文件.在app.js中,我添加了以下内容:
app.use(function(req, res, next){
console.log("--------new middleware");
next();
});
Run Code Online (Sandbox Code Playgroud)
但它根本不是在调用中间件.该应用程序的其余部分工作正常,我已确认服务器正在运行并接收请求.
这是app.js:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var passport = require('passport');
var routes = require('./routes/index');
var users = require('./routes/users');
Run Code Online (Sandbox Code Playgroud)
//很多路线
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({ secret: 'separation anxiety' }));
app.use(passport.initialize()); …Run Code Online (Sandbox Code Playgroud) 这篇很棒的文章在这里:https : //www.alexedwards.net/blog/how-to-properly-parse-a-json-request-body 很好地解释了如何编写 Golang 处理程序。
我需要使用两个处理程序,一个接一个,仅当第一个出现错误时。
像这样:
func main() {
r := chi.NewRouter()
r.Post("/api", MyHandlers)
}
func MyHandlers(w http.ResponseWriter, r *http.Request) {
err := DoSomething(w, r)
if err != nil {
println("OMG! Error!")
DoSomethingWithThisOneInstead(w, r)
}
}
func DoSomething(w http.ResponseWriter, r *http.Request) error {
// here I need to read request's Body
// and I can use io.TeeReader()
// and I can use all the code in the amazing article example
// but I don't want to, because …Run Code Online (Sandbox Code Playgroud) 我使用 scrapy 创建了一个脚本来从网页中获取一些字段。登陆页面的 url 和内部页面的 url 经常被重定向,因此我创建了一个中间件来处理该重定向。然而,当我看到这篇文章时,我明白我需要return request在process_request()用原始网址替换重定向网址后。
meta={'dont_redirect': True,"handle_httpstatus_list": [301,302,307,429]}当请求从蜘蛛发送时,它总是存在的。
由于所有请求都没有被重定向,我尝试替换_retry()方法中的重定向网址。
def process_request(self, request, spider):
request.headers['User-Agent'] = self.ua.random
def process_exception(self, request, exception, spider):
return self._retry(request, spider)
def _retry(self, request, spider):
request.dont_filter = True
if request.meta.get('redirect_urls'):
redirect_url = request.meta['redirect_urls'][0]
redirected = request.replace(url=redirect_url)
redirected.dont_filter = True
return redirected
return request
def process_response(self, request, response, spider):
if response.status in [301, 302, 307, 429]:
return self._retry(request, spider)
return response
Run Code Online (Sandbox Code Playgroud)
问题:使用中间件将重定向的 url 替换为原始 url 后如何发送请求?
middleware ×13
node.js ×5
express ×4
javascript ×3
php ×3
jwt ×2
laravel ×2
.net-5 ×1
admin ×1
appsettings ×1
architecture ×1
asp.net-core ×1
go ×1
go-chi ×1
guzzle ×1
handler ×1
http ×1
panel ×1
python ×1
python-3.x ×1
reactjs ×1
redux ×1
scrapy ×1
socket.io ×1
typescript ×1
web-scraping ×1