2012-07-04 51 views

回答

221

应用程序对象在创建Express服务器时被实例化。它有一个中间件堆栈可以在app.configure()(this is now deprecated in version 4.x)定制。

要设置您的中间件,您可以为要添加的每个中间件层调用app.use(<specific_middleware_layer_here>)(它可以是所有路径通用的,或者仅在您的服务器处理的特定路径上触发),并且它将添加到您的Express中间件堆栈。可以在多个调用use中逐个添加中间件层,或者甚至可以一次与一个调用串行地添加中间件层。 有关更多详细信息,请参见use documentation

要给出快递中间件的概念理解的例子,这里是我的应用中间件堆栈(app.stack)看起来登录我的应用程序对象时控制台为JSON,如:

stack: 
    [ { route: '', handle: [Function] }, 
    { route: '', handle: [Function: static] }, 
    { route: '', handle: [Function: bodyParser] }, 
    { route: '', handle: [Function: cookieParser] }, 
    { route: '', handle: [Function: session] }, 
    { route: '', handle: [Function: methodOverride] }, 
    { route: '', handle: [Function] }, 
    { route: '', handle: [Function] } ] 

,你可能会能够推断,我打电话给app.use(express.bodyParser())app.use(express.cookieParser())等,它们将这些快递中间件的'图层'添加到中间件堆栈中。请注意,路由是空白的,这意味着当我添加了那些中间件层时,我指定它们在任何路由上被触发。如果我添加了一个只在路径/user/:id上触发的自定义中间件层,该路径将在上面的堆栈打印输出中的该中间件层对象的route字段中反映为字符串。

每一层本质上都是添加一个函数,该函数专门处理通过中间件的流。

例如,通过添加bodyParser,,您可以确保您的服务器通过快递中间件处理传入请求。因此,现在解析传入请求的主体是您的中间件在处理传入请求时所需的过程的一部分--全部因为您称为app.use(bodyParser)

+66

谢谢。明确的人会在他们的API文档中解释这一点很困难吗? – ericsoco

+4

所以你说当接收到一个请求时,数据会在实际服务之前通过这些解析器,例如:Valid Request-> Authentication-> ProcessesRequest-> ServResponse ** USE **将按特定顺序控制这些步骤,而不是并行执行它们? –

+1

因此,app.use()依赖注入是否有效? –

34

use是一种配置Express HTTP服务器对象的路由使用的中间件的方法。该方法被定义为Express基于的Connect的一部分。

+2

来源:https://github.com/senchalabs/connect/blob/master/lib/proto.js#L62 –

+3

而在线文档在这里:http://www.senchalabs.org/connect/proto.html# app.use –

+0

如果一个Node中间件实例化对象会有效吗?这是否意味着每次请求时,该中间件都会实例化新的对象?旧物体是否被丢弃?例如'app.use(function(){var object = new SomeConstructor; next();})' – CMCDragonkai

8

app.use()用于装入中间件函数或挂载到指定路径,当基本路径匹配时执行中间件函数。

例如: 如果正在使用indexRouter.js app.use(),是这样的:

//indexRouter.js 

var adsRouter = require('./adsRouter.js'); 

module.exports = function(app) { 
    app.use('/ads', adsRouter); 
} 

在上面的代码app.use()安装在“/广告的路径'到adsRouter.js。现在

在adsRouter.js

// adsRouter.js 

var router = require('express').Router(); 
var controllerIndex = require('../controller/index'); 
router.post('/show', controllerIndex.ads.showAd); 
module.exports = router; 

在adsRouter 。js,路径将如此 - 广告'/ ads/show',然后根据controllerIndex.ads.showAd()工作。

app.use([路径],回调,[回调]): 我们可以在相同的添加回调。

app.use('/test', function(req, res, next) { 

    // write your callback code here. 

    }); 
+0

好了解释。谢谢 –

+0

欢迎@ Dushyant Joshi –

1

app.use()的作品像:

  1. 请求事件trigered节点HTTP服务器实例。
  2. express 做req对象的一些内部操作。
  3. 这是当 快递开始做你app.use

这很简单的事情规定。

只有然后明确会做其他的东西,如路由。

1

中间件是软件的通用术语,其用来“粘合在一起”,从而 app.use是配置中间件,例如一种方法:解析和处理的请求的主体: app.use(bodyParser。 urlencoded({extended:true})); app.use(bodyParser.json()); 还有你可以在你Express应用程序 只使用阅读文档许多中间件: http://expressjs.com/en/guide/using-middleware.html

10

每个app.use(中间件)被称为每次请求被发送到服务器的时间。

0

通过使用app.use()和app.METHOD()函数将应用程序级中间件绑定到应用程序对象的实例,其中METHOD是中间件函数处理的请求的HTTP方法(例如GET ,PUT或POST)小写。

0

在快递中,如果我们 从“express” 进口快递并使用app = express(); 则具有明确

所有功能,如果我们使用app.use()

与任何模块/中间件功能在整个快递项目使用的应用程序