Articles of 中间件

Node.js中间件组织和参数validation

我正在构build一个快速的应用程序,我想知道我可以用中间件获得多大的function。 粗略地说,我想用中间件来完成以下任务。 完成: 将requestId添加到所有路由 validation请求 检查用户是否有权访问给定的资源(除了身份validation) 尚未完成: A)validation给定路线的参数 B)如果中间件与路由不同,则以合理的方式组织中间件,每个路由按惯例调用3个中间件 我已经在一个单独的文件中定义了我的中间件,并将其导入到app.js中,如下所示: var middleware = require('./middleware'); var requestId = middleware.requestId; var authenticate = middleware.authenticate; 要将其应用到所有路线,我将其添加到表示config: var app = express.createServer(); app.configure(function () { app.use(express.logger()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(requestId); // add requestId to all incoming requests }); 而对于具体的路由,我把它作为一个app.get参数来添加: var routes = require('./v1/routes'); app.get("/v1/foo", routes.foo); app.get("/v1/bar", authenticate, routes.bar); 问题A 我很想有可以用来检查参数的中间件 validate('x','y','z') […]

了解Express.js中的中间件和路由处理程序

我想了解中间件和路由处理程序如何在Express中工作。 在“ 使用Node和Express进行Web开发”一书中 ,笔者给出了一个有趣的途径和中间件的例子,但并没有给出实际的细节。 有人能帮我理解下面例子中的每一步会发生什么,这样我就可以肯定我正确地思考了吗? 这里是例子(在我的理解和问题的意见): //get the express module as app var app = require('express')(); //1. when this module is called, this is printed to the console, always. app.use(function(req, res, next){ console.log('\n\nALLWAYS'); next(); }); //2. when a route /a is called, a response 'a' is sent and the app stops. There is no action […]

如何在res.send之后但在响应离开服务器之前挂钩==>当res.statusCode被知道时

我已经通过app.use()方法使用了Express.js中的中间件工具来钩住所有的请求并logging一条消息,但是发现res.statusCode几乎总是200的事实,我检查的是不正确的。 我认为这是默认值,因为它还没有用res.send(204)自己的statusCode代替,总是200 。 我知道我可以在每个请求中的每个res.send(x)之后logging消息,但正如你所想象的那样,这很麻烦。 所以,问题是: 在哪里/如何将我的中间件函数与仅在一个地方的条件挂钩,并且res.statusCode是客户端真正看到的那个? 相关代码: // Log API requests. app.use(function (req, res, next) { logger.info('API request.', { module: 'core' data : { req: { method: req.method, url : req.url, ip : req.ip }, res: { status_code: res.statusCode // Always 200 and not the really one. } } }); next(); }); app.use(app.router); 如果我移动app.use(app.router) ,中间件不会被执行。

在发送响应之后,如何在Node / Express中结束当前的请求处理?

在这个问题上有几个post,但没有直接回答这个问题,正面。 让我澄清,我明白(或者我认为)使用next(),next('route'),return next(),返回以及它们对控制stream的影响。 我的整个应用程序中间件由一系列的app.use组成,如下所示: app.use(f1); app.use(f2); app.use(f3); app.use(f4); … 在这些中间件的每一个中,我都有可能发送响应,而不需要进一步的处理。 我的问题是,我无法停止处理到下一个中​​间件。 我有一个笨拙的工作。 发送响应后,我只是设置res.locals.completed标志。 在所有的中间件,一开始,我检查这个标志,并跳过在中间件的处理,如果标志设置。 在第一个中间件中,这个标志是未设置的。 当然,必须有更好的解决办法,那是什么? 我认为Express会隐式地通过一些特定的方法检查并跳过中间件?

是否有可能在节点快递中跳过路由中间件?

快递中采取以下POSTfunction。 (我正在使用Express 3.5.1) app.post('/example', someFunctionOne, someFunctionTwo, function(req, res){ if(!req.someVar){ return res.send(400, { message: 'error'}); } else{ return res.json(200, { message: 'ok'}); } }); 如果我从某个FunctionOne中得到一些结果,这意味着某些FunctionTwo是多余的,有没有办法跳过一些FunctionTwo并转到最后一个未命名的函数来发送响应? 所以我想同样的方式有“next()”函数,“last()”函数在哪里? 如果这不可能,为什么不呢? 这对我来说似乎是一个疏忽,但是有一个很好的理由吗?

Node.js – 在中间件中使用res.redirect

我想在加载所有的页面之前使用authenticateUser()中间件。 (在app.get('/',authenticateUser,function()…))中,我试图在app.use(authenticateUser)之前调用app.use(app.router )。 但是这并没有奏效。 authenticateUser基本上是: if (req.session.loginFailed) { next() else { if (req.session.user_id) { … if (userAuthenticated) { next(); } else { req.session.loginFailed = true; console.log('setting loginFailed to true'); res.redirect('/login'); } } } 然后在app.get('/ login')我设置req.session.loginFailed为false; 这应该工作,但我只想调用它的app.get()或app.post()等我的实际网页之一。 我认为它被许多不同的请求调用(因为在加载一个页面,'设置loginFailed为真'被称为多次) 有一个更好的方法吗? 还是应该在我网站上的每一页之前简单地调用它?

如何在Express中获取POST字段,而不使用bodyParser中间件?

在最新版本的Express中,build议(通过debugging消息传递)是停止使用bodyParser中间件。 我读了一下,它看起来像bodyParser是json和urlencoded中间件的包装 – 而且看,Express(3.4.4)的最新版本使用这两个而不是bodyParser即用的bodyParser – 出色的,对? 但现在,我无法到达我的领域。 req.body是未定义的。 这是我的JS表单提交代码(仅文本字段,没有文件)。 请问有人可以告诉我哪个属性/函数的要求,我用来获取值? var formData = new FormData($('#myForm')[0]); $.ajax({ url: '/myurl', cache: false, contentType: false, processData: false, data: formData, type: 'POST', success: function(data) { console.log(data); }, error: function(jqXHR, textStatus, errorThrown) { console.error('Error occured: ' + errorThrown); } });

在节点express中再次调用相同的请求

我正在使用Express将请求代理到受OAuth 2访问令牌保护的单独API服务器。 当一个令牌到期时,服务器将返回一个401,我现在正在我的路由器中间件中处理,然后刷新与客户端会话(我正在使用express-session )相关的访问令牌。 这是我的代码: router.js app.use('/api', require('./routes.js')); routes.js var express = require('express'), router = express.Router(), routesController = require('./routes.controller.js'); router.route('/*') .get(routesController.fetch); routes.controller.js module.exports.fetch = function(req, res, next) { var options = helpers.buildAPIRequestOptions(req); request(options, function(err, response, body){ if(response.statusCode === 401) { authController.refreshToken(req, res, next); } else { res.status(response.statusCode).send(body); } }); }; authController module.exports.refreshToken = function(req, res, […]

Node.js – Expressjs中间件来扩展res.render

我想知道是否有一个内置的方式来扩展Express.js的res.render函数,因为我想传递一个默认的“本地”设置到每个模板呈现。 目前我已经编写了一个小的中间件,使用underscore.js的扩展函数来合并默认的“本地”和那个特定的模板: app.use(function(req, res, next){ res.render2 = function (view, locals, fn) { res.render(view, _.extend(settings.template_defaults, locals), fn); }; next(); }); 有一个更好的方法吗?

express / connect中间件在响应发送给客户端后执行

是否有可能编写一个中间件,在响应发送到客户端之后执行,或者在将响应发送到客户端之前处理和调用请求之后执行?