app.use和app.get与express.static之间的区别是什么?

时间:2014-11-27 02:17:10

标签: node.js express

注意:原来我的问题不是middlware express.static(),而是app.use()和app.get()之间的区别。这个问题完美地回答了它(比明确的API文档更好!):

Difference between app.use and app.get in express.js

我理解app.use(' /')和app.get(' /')之间的区别在于后者仅向该端点提供HTTP GET请求,前者为该端点提供所有HTTP请求。

我也理解express.static中间件提供从目录路径到端点的静态页面。

我不能遵循的原因是:

app.get('/', express.static(__dirname + '/public')

仅提供所请求的第一页,而不是所请求页面引用的任何ref =或src = link / script页面。例如,这里有两个摩根痕迹响应一个简单的index.html页面,该页面有一个css链接到文件' style.css'

1)使用app.use(' /')

跟踪服务器请求
Server listening on 0.0.0.0:8080
GET / 200 6.258 ms - 444
GET /style.css 304 2.842 ms - -

2)使用app.get(' /')

跟踪服务器请求
Server listening on 0.0.0.0:8080
GET / 304 5.131 ms - -
GET /style.css 404 2.990 ms - 22

404 ???

即使浏览器向' /'发送了GET请求,app.get(' /')也无法为css提供服务,但app.use如何? (' /')成功了。

我在app.get(' /')或express.static中缺少哪些细节?

提前致谢, PT

这是一个简单,简单的代码:

app.js:

var morgan = require('morgan'),
    express = require('express'),
    app = express(),
    server = require('http').Server(app);
app.use(morgan('dev'));

   // Uncomment .get or .use, but not both

   // this only serves index.html, not style.css when I nav to localhost:8080/
   //app.get('/', express.static(__dirname + '/pub'));

   // this serves both pages when I nav to localhost:8080/
   app.use('/', express.static(__dirname + '/pub'));

server.listen(8080);

这是html ......

的index.html

<!doctype html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="style.css">
  </head>
</html>

路径:

/app.js
/pub/index.html
/pub/style.css

2 个答案:

答案 0 :(得分:6)

app.get('/', handler)是&#34;添加/到路由表,当http GET请求到达时,呼叫处理程序&#34;

app.use(middlevare)&#34;将middlevare添加到堆栈&#34;。

&#34;中间件&#34;是一个接受(request, response, next)的函数,下一个中间件由前一个使用next()

显式调用

express.static()返回中间件 - 特别是一个检查请求路径并将相应文件的内容流式传输到响应的函数。如果您使用app.get('/') 添加它,则永远不会调用非 - &#34; /&#34;路由

答案 1 :(得分:1)

简短回答app.use('/', express.static(__dirname + '/public'))将匹配以/开头的任何路径。这意味着包含/about/contact之类的内容。但是,app.get('/', express.static(__dirname + '/public'))仅匹配特定路由/。因此,/about/contact例如不会被包括在内。