我对express和node.js有点陌生,我搞不清楚app.use和app.get之间的区别。看起来你可以同时使用它们来发送信息。例如:

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

似乎和这个是一样的:

app.get('/', function (req,res) {
   res.send('Hello');
});

当前回答

App.use()用于将中间件绑定到应用程序。该路径是一个“挂载”或“前缀”路径,并限制中间件只能应用于以它开头的请求的任何路径。它甚至可以用来嵌入另一个应用程序:

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

通过指定/作为“挂载”路径,app.use()将响应任何以/开头的路径,这些路径都是以/开头的,不管使用的HTTP动词是什么:

GET / 把/ foo POST / foo / bar 等。

另一方面,app.get()是Express应用程序路由的一部分,用于在请求GET HTTP谓词时匹配和处理特定的路由:

GET /

并且,你的app.use()示例的等效路由实际上是:

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

(更新:试图更好地展示差异。)

包括app.get()在内的路由方法都是方便的方法,可以帮助您更精确地将响应与请求对齐。他们还增加了对参数和next('route')等功能的支持。

在每个app.get()中都是对app.use()的调用,所以你当然可以直接使用app.use()完成所有这些。但是,这样做通常需要(可能是不必要的)重新实现各种数量的样板代码。

例子:

For simple, static routes: app.get('/', function (req, res) { // ... }); vs. app.use('/', function (req, res, next) { if (req.method !== 'GET' || req.url !== '/') return next(); // ... }); With multiple handlers for the same route: app.get('/', authorize('ADMIN'), function (req, res) { // ... }); vs. const authorizeAdmin = authorize('ADMIN'); app.use('/', function (req, res, next) { if (req.method !== 'GET' || req.url !== '/') return next(); authorizeAdmin(req, res, function (err) { if (err) return next(err); // ... }); }); With parameters: app.get('/item/:id', function (req, res) { let id = req.params.id; // ... }); vs. const pathToRegExp = require('path-to-regexp'); function prepareParams(matches, pathKeys, previousParams) { var params = previousParams || {}; // TODO: support repeating keys... matches.slice(1).forEach(function (segment, index) { let { name } = pathKeys[index]; params[name] = segment; }); return params; } const itemIdKeys = []; const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys); app.use('/', function (req, res, next) { if (req.method !== 'GET') return next(); var urlMatch = itemIdPattern.exec(req.url); if (!urlMatch) return next(); if (itemIdKeys && itemIdKeys.length) req.params = prepareParams(urlMatch, itemIdKeys, req.params); let id = req.params.id; // ... });

注意:Express对这些特性的实现包含在它的路由器、层和路由中。

其他回答

简单的 app.use表示“在所有请求上运行这个” app.get的意思是“在给定URL的GET请求上运行这个”

App.use()用于将中间件绑定到应用程序。该路径是一个“挂载”或“前缀”路径,并限制中间件只能应用于以它开头的请求的任何路径。它甚至可以用来嵌入另一个应用程序:

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

通过指定/作为“挂载”路径,app.use()将响应任何以/开头的路径,这些路径都是以/开头的,不管使用的HTTP动词是什么:

GET / 把/ foo POST / foo / bar 等。

另一方面,app.get()是Express应用程序路由的一部分,用于在请求GET HTTP谓词时匹配和处理特定的路由:

GET /

并且,你的app.use()示例的等效路由实际上是:

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

(更新:试图更好地展示差异。)

包括app.get()在内的路由方法都是方便的方法,可以帮助您更精确地将响应与请求对齐。他们还增加了对参数和next('route')等功能的支持。

在每个app.get()中都是对app.use()的调用,所以你当然可以直接使用app.use()完成所有这些。但是,这样做通常需要(可能是不必要的)重新实现各种数量的样板代码。

例子:

For simple, static routes: app.get('/', function (req, res) { // ... }); vs. app.use('/', function (req, res, next) { if (req.method !== 'GET' || req.url !== '/') return next(); // ... }); With multiple handlers for the same route: app.get('/', authorize('ADMIN'), function (req, res) { // ... }); vs. const authorizeAdmin = authorize('ADMIN'); app.use('/', function (req, res, next) { if (req.method !== 'GET' || req.url !== '/') return next(); authorizeAdmin(req, res, function (err) { if (err) return next(err); // ... }); }); With parameters: app.get('/item/:id', function (req, res) { let id = req.params.id; // ... }); vs. const pathToRegExp = require('path-to-regexp'); function prepareParams(matches, pathKeys, previousParams) { var params = previousParams || {}; // TODO: support repeating keys... matches.slice(1).forEach(function (segment, index) { let { name } = pathKeys[index]; params[name] = segment; }); return params; } const itemIdKeys = []; const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys); app.use('/', function (req, res, next) { if (req.method !== 'GET') return next(); var urlMatch = itemIdPattern.exec(req.url); if (!urlMatch) return next(); if (itemIdKeys && itemIdKeys.length) req.params = prepareParams(urlMatch, itemIdKeys, req.params); let id = req.params.id; // ... });

注意:Express对这些特性的实现包含在它的路由器、层和路由中。

app.get在HTTP方法设置为GET时被调用,而app.use则不管HTTP方法是什么都被调用,因此它定义了一个层,该层位于快速包提供给你访问的所有其他RESTful类型之上。

每次请求发送到服务器时,都会调用App.use。 唯一的事情是我们应该在处理get, put, post等请求之前调用它

app.use(middleware); 
function middleware(req, res, next)
{
  console.log("Came in middleware function without arrow");
  next();
}

App.get只对给定路径的get请求被调用。

app.get('/myget', myget_function);
function myget_function(req, res)
{
  console.log("Came in function myget");
  res.send('Hello World! from myget');
}

post只在给定路径的post请求时被调用。

app.post('/mypost', mypost_function); 
function mypost_function(req, res)
{
  console.log("Came in function mypost");
  res.send('Hello World! from mypost');
}

app.use和app.get的区别:

app.use→它通常用于在应用程序中引入中间件,可以处理所有类型的HTTP请求。

app.get→仅用于处理GET HTTP请求。

现在,app.use和app.all之间有一个混淆。毫无疑问,它们有一个共同点,那就是它们都可以处理所有类型的HTTP请求。 但有一些区别,建议我们使用app.use作为中间件,而app.all用于路由处理。

app.use()→只需要一个回调。 app.all()→它可以接受多个回调。 App.use()将只查看url是否以指定的路径开始。 但是,app.all()将匹配完整的路径。

例如,

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/subject

在app.use()内部的Next()调用将调用下一个中间件或任何路由处理程序,但在app.all()内部的Next()调用将调用下一个路由处理程序(app.all(), app.get/post/put…只等)。如果后面有任何中间件,它将被跳过。因此,建议将所有中间件始终放在路由处理程序之上。