我对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');
});
我对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是Connect (Express所依赖的中间件框架)中的“低级”方法。
以下是我的指导原则:
如果你想公开一个GET方法,请使用app.get。 如果你想添加一些中间件(HTTP请求到达你在Express中设置的路由之前的处理程序),或者如果你想让你的路由模块化(例如,从npm模块中公开一组路由供其他web应用程序使用),请使用app.use。
其他回答
除了以上的解释,我所经历的:
app.use('/book', handler);
将匹配所有以“/book”开头的请求。所以它也匹配" /book/1 "或" /book/2 "
app.get('/book')
只匹配精确匹配的GET请求。它不会处理像'/book/1'或'/book/2'这样的url
所以,如果你想要一个全局处理程序来处理你所有的路由,那么app.use('/')是选项。app.get('/')将只处理根URL。
app.get在HTTP方法设置为GET时被调用,而app.use则不管HTTP方法是什么都被调用,因此它定义了一个层,该层位于快速包提供给你访问的所有其他RESTful类型之上。
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。 唯一的事情是我们应该在处理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是Connect (Express所依赖的中间件框架)中的“低级”方法。
以下是我的指导原则:
如果你想公开一个GET方法,请使用app.get。 如果你想添加一些中间件(HTTP请求到达你在Express中设置的路由之前的处理程序),或者如果你想让你的路由模块化(例如,从npm模块中公开一组路由供其他web应用程序使用),请使用app.use。