天道酬勤,学无止境

app.use 和 app.get 与 express.static 有什么区别?(What's the difference between app.use and app.get with express.static?)

问题

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

express.js 中 app.use 和 app.get 的区别

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

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

我不遵循的是为什么:

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

仅提供请求的第一个页面,而不提供请求页面引用的任何 ref= 或 src= 链接/脚本页面。 例如,这里有两个摩根跟踪响应一个简单的 index.html 页面,该页面具有指向文件“style.css”的 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

这是简单、简单的代码:

应用程序.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...

索引.html

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

小路:

/app.js
/pub/index.html
/pub/style.css
回答1

app.get('/', handler)是“添加/到路由表,当http GET请求到达时调用处理程序”

app.use(middlevare)是“将中间件添加到堆栈中”。

“中间件”是一个接受(request, response, next)的函数(request, response, next)一个中间件由上一个使用 next() 显式调用

express.static() 返回中间件 - 具体来说,是一个检查请求路径和将相应文件的内容流式传输到响应的函数。 如果您使用app.get('/')添加它,它永远不会调用非“/”路由

回答2

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

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • app.all('*')和app.use('/')之间的区别(Difference between app.all('*') and app.use('/'))
    问题 app.all('*', ... )和app.use('/', ...)之间有有用的区别吗? 回答1 在大多数情况下,它们将等效地工作。 最大的不同是中间件的应用顺序: app.all()附加到应用程序的路由器,因此只要到达app.router中间件(用于处理所有方法路由... GET,POST等),便会使用它。 注意:app.router已在Express 4.x中弃用 app.use()附加到应用程序的主中间件堆栈,因此按中间件指定的顺序使用。 例如,如果您把它放在第一位,它将是第一件事。 如果将它放在最后(在路由器之后),则通常根本不会运行它。 通常,如果您想对所有路由进行全局处理,则app.use()是更好的选择。 而且,它将来发生错误的可能性较小,因为express 0.4可能会删除隐式路由器(这意味着路由器在中间件中的位置比现在更重要,因为从技术上讲,您甚至不必使用它马上)。 回答2 app.use只接受一个回调函数,它用于中间件。 中间件通常不处理请求和响应,(从技术上讲,它们可以处理)它们只处理输入数据,并将其移交给队列中的下一个处理程序。 app.use([path], function) app.all需要多个回调,并用于路由。 通过多个回调,您可以过滤请求并发送响应。 它在express.js的过滤器中进行了解释 app.all(path,
  • Express-js无法获取我的静态文件,为什么?(Express-js can't GET my static files, why?)
    问题 我将代码简化为我可以做的最简单的express-js应用程序: var express = require("express"), app = express.createServer(); app.use(express.static(__dirname + '/styles')); app.listen(3001); 我的目录如下所示: static_file.js /styles default.css 但是,当我访问http://localhost:3001/styles/default.css ,出现以下错误: Cannot GET / styles / default.css 我正在使用express 2.3.3和node 0.4.7 。 我究竟做错了什么? 回答1 尝试http://localhost:3001/default.css 。 要在请求网址中包含/styles ,请使用: app.use("/styles", express.static(__dirname + '/styles')); 查看此页面上的示例: //Serve static content for the app from the "public" directory in the application directory. // GET /style.css etc app.use
  • Nodejs Index.html 加载但链接和脚本 404(Nodejs Index.html Loads but Links & Scripts 404)
    问题 我有一个 nodejs 服务器运行,客户端封装在客户端文件夹中,以便轻松管理 index.html 的文件夹结构。 那么链接和脚本应该加载没问题。 client folder /index.html /style.css /script.js closer folder /closure /etc. app.js package.json utility.js 在我的 app.js 文件中,我有一个正常的 app.get ('/', function (req,res) { res.render('index.html'); }); 当我运行并转到本地主机端口时,文件会加载,但是当我打开 chrome 控制台时,我看到 index.html 文件无法加载任何脚本,并且找不到 404 错误。 我注意到在很多快速应用程序中似乎有一个共同的模式 this app.set('views', __dirname + '/client'); this app.use(express.static(__dirname + "./client")); this app.use('client', express.directory('client')); 但我没有看到关于 app.use 和 app.set 之间区别的解释,也没有很好的解释,我能找到的最好的是 app.set('views'
  • 在Express中使用app.configure(Using app.configure in express)
    问题 我找到了一些代码,他们在不使用app.configure情况下设置了Express,我想知道,在没有环境说明符的情况下使用app.configure和不使用它之间有什么区别? 换句话说,这之间有什么区别: var app = require(express); app.configure(function(){ app.set('port', process.env.PORT || config.port); app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ app.use(express.bodyParser()); app.use(express.static(path.join(__dirname, 'site'))); } 和这个: var app = require(express); app.set('port', process.env.PORT || config.port); app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ app.use(express.bodyParser()); app.use(express.static(path.join(__dirname,
  • Node.js / Express.js - How does app.router work?(Node.js / Express.js - How does app.router work?)
    问题 在询问app.router之前,我认为我至少应该解释一下使用中间件时发生的事情。 要使用中间件,要使用的功能是app.use() 。 当执行中间件时,它将使用next()调用下一个中间件,或者使其不再被调用。 这意味着我放置中间件调用的顺序很重要,因为某些中间件依赖于其他中间件,而接近末尾的某些中间件甚至可能不会被调用。 今天,我正在开发应用程序,并在后台运行服务器。 我想进行一些更改并刷新我的页面,然后立即查看更改。 具体来说,我正在更改自己的布局。 我无法使它正常工作,所以我在Stack Overflow中搜索了答案,并找到了这个问题。 它说要确保express.static()在require('stylus')之下。 但是,当我查看该OP的代码时,我发现他在中间件调用的最后app.router调用了app.router ,我试图弄清楚为什么会这样。 当我制作Express.js应用程序(版本3.0.0rc4)时,我使用了命令express app --sessions --css stylus并且在我的app.js文件中,代码由我的app.router设置在express.static()之上express.static()和require('stylus')调用。 如此看来,如果它已经以这种方式设置,那么它应该保持这种方式。 重新排列代码以便可以看到手写笔更改后
  • 使用nodejs和express搭建http web服务
    文章目录简介使用nodejs搭建HTTP web服务请求nodejs服务第三方lib请求post获取http请求的正文Express和使用express搭建http web服务express helloworldexpress路由Express 路由句柄中间件Express 响应方法Express 的静态资源Express 使用模板引擎总结简介nodejs作为一个优秀的异步IO框架,其本身就是用来作为http web服务器使用的,nodejs中的http模块,提供了很多非常有用的http相关的功能。虽然nodejs已经带有http的处理模块,但是对于现代web应用程序来说,这或许还不太够,于是我们有了express框架,来对nodejs的内容进行扩展。今天我们将会介绍一下使用nodejs和express来开发web应用程序的区别。使用nodejs搭建HTTP web服务nodejs提供了http模块,我们可以很方便的使用http模块来创建一个web服务:const http = require('http')const hostname = '127.0.0.1'const port = 3000const server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content
  • 文件和文件夹的Node.js项目命名约定(Node.js project naming conventions for files & folders)
    问题 大型Node.js项目中文件和文件夹的命名约定是什么? 我应该大写,驼峰式还是下划线? IE。 这被认为有效吗? project-name app controllers someThings.js users.js models someThing.js user.js views some-things index.jade users logIn.jade signUp.jade ... 回答1 在使用node几年后,我可以说目录/文件结构没有约定。 但是,大多数(专业)快递应用程序都使用类似以下的设置: / /bin - scripts, helpers, binaries /lib - your application /config - your configuration /public - your public files /test - your tests 使用此设置的示例是nodejs-starter。 我个人将此设置更改为: / /etc - contains configuration /app - front-end javascript files /config - loads config /models - loads models /bin - helper scripts /lib - back-end express files
  • Express框架基础
    Express 框架简介及初体验 Express 框架是什么? Express 框架是一个基于 Node 平台的 web 应用开发框架,它提供了一系列强大特性,帮助我们创建各种 Web 应用。使用前 npm install express 进行下载。在此只以学习前端的目的去了解这个框架,想了解更多可以查阅 Express 官网 介绍 Express 框架具有哪些特性? 提供了方便简洁的路由定义方式简化 HTTP 请求参数的获取过程模板引擎支持程度高,方便渲染页面提供了高效控制 HTTP 请求的中间件机制拥有大量可对功能进行扩张的第三方中间件 原生 Node.js 与 Express 比较(服务器创建、路由定义、参数处理)。 1、创建服务原生 Node.js 调用 http 模块下的 createServer() 方法,使用 Express 框架只需要调用 express 模块返回的函数即可。 // 原生Node.js const http = require('http'); const app = http.createServer(); app.listen(80); // 使用Express框架 const express = require('express'); const app = express(); app.listen(80); 2、路由定义原生 Node.js
  • onload js调用不适用于节点(onload js call not working with node)
    问题 我开始学习node.js,现在我只想尝试使用node执行我的旧无节点应用程序。 在这个应用程序中,我有一个HTML页面,该页面带有一个调用onload js函数的主体。 工作正常。 现在我有一个节点应用程序:app.js,就这么简单: var express = require ('express'); var app = express (); app.use(express.static(__dirname + '/images')); app.use(express.static(__dirname + '/CSS')); app.use(express.static(__dirname + '/font')); app.use(express.static(__dirname )); app.use(express.static(__dirname +'/ketcher')); app.use(express.static(__dirname +'/ChemAlive_JS')); app.get('/', function(req, res) { res.sendFile('/home/laetitia/Project/ChemAlive_Interface_Node/ChemAlive_Interface.html'); }); app.listen(8080)
  • 基于Node.js平台的Express教程
    基于Node.js平台的Express教程 Express 简介什么是 ExpressExpress 能做什么 Express 的基本使用安装 Express创建基本的 Web 服务器监听 GET 请求监听 POST 请求获取 URL 中携带的查询参数获取 URL 中的动态参数托管静态资源express.static() 托管多个静态资源目录挂载路径前缀 nodemonnodemon 的作用安装 nodemon使用 nodemon Express 路由路由的概念Express 中的路由路由的匹配过程路由的使用简单用法模块化路由创建路由模块注册路由模块为路由模块添加前缀 Express 中间件中间件的概念什么是中间件Express 中间件的调用流程Express 中间件的格式next 函数的作用 Express 中间件的使用案例定义中间件函数全局生效的中间件中间件的作用定义多个全局中间件局部生效的中间件定义多个局部中间件使用注意事项 中间件的分类应用级别的中间件路由级别的中间件 错误级别中间件第三方的中间件 Express 写接口开发过程文件结构推荐 Express 简介 什么是 Express 官方的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。 Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web
  • 在Node.js中加载基本HTML(Loading basic HTML in Node.js)
    问题 我试图找出如何加载和呈现基本HTML文件的方法,因此不必编写类似以下的代码: response.write('...<p>blahblahblah</p>...'); 回答1 我只是找到一种使用fs库的方法。 我不确定这是否是最干净的。 var http = require('http'), fs = require('fs'); fs.readFile('./index.html', function (err, html) { if (err) { throw err; } http.createServer(function(request, response) { response.writeHeader(200, {"Content-Type": "text/html"}); response.write(html); response.end(); }).listen(8000); }); 基本概念只是原始文件读取和转储内容。 不过,仍然可以接受更清洁的选择! 回答2 使用app.get获取html文件。 这很简单!! const express = require('express'); const app = new express(); app.get('/', function(request, response){ response.sendFile(
  • 如何在Express 4.0中发送Flash消息?(How to send flash messages in Express 4.0?)
    问题 因此,我的Web应用程序需要身份验证,并且我有一个注册页面,如果该人员尝试使用数据库中已经存在的电子邮件进行注册,则我想向他们显示错误消息。 我正在尝试在html端使用以下代码来做到这一点: <% if (message.length > 0) { %> <div class="alert alert-danger"><%= message %></div> <% } %> 并在我的路线中执行以下操作: router.get('/signup', function(req, res) { res.render('/signup', { message: req.flash('signupMessage') }); }); 我已经尝试通过以下方式设置配置: app.configure(function() { app.use(express.session({ secret : 'keyboard cat' })); }); 但这给了我一个TypeError: 12:11:38 web.1 | app.configure(function() { 12:11:38 web.1 | ^ 12:11:38 web.1 | TypeError: Object function (req, res, next) { 我真的很困惑,因为我知道我需要会话才能使Flash正常工作
  • Node.js 学习笔记!
    Node.js学习笔记 Day011、浏览器工作原理1.1 浏览器的组成1.2 渲染引擎1.3 渲染引擎工作原理1.4 页面reflow 和layout过程1.5 浏览器访问服务器过程1.6 HTTP请求报文和响应报文格式 2、web开发本质2.1 **牢记以下三点:**2.2 关于C/S(Client/Server)和B/S(Brower/Server) 3、node.js3.1 node.js是什么3.2 node.js的特点3.3 node.js 安装和配置3.4 nvm和nvm-windows 介绍3.5 Node.js 开发web应用程序和PHP、java、ASP.net 等传统模式开发web应用程序的区别**传统模式开发:****Node.js 开发:****核心区别:** 3.6 REPL介绍 4、Node.js 开发4.1 Javascript 命名规则4.2 node.js中单线程——非阻塞IO解释4.3 fs 模块4.3.1 fs.writeFile(file, data[, options], callback) 写入文件操作4.3.2 fs.readFile(path, [, options], callback) 写入文件操作4.3.3 __dirname 和 __filename 获取正在执行的js文件的路径 4.4 path 模块 (进行路径拼接)4
  • 错误:无法在Express中查找视图(Error: Failed to lookup view in Express)
    问题 注意:我在帖子末尾自动回答 我正在尝试更好地体验nodeJS,我真的不喜欢将所有脚本都放在一个文件中。 因此,在此之后的帖子中,我使用了这种结构 ./ config/ enviroment.js routes.js public/ css/ styles.css images views index index.jade section index.jade layout.jade app.js 我的文件现在是: app.js var express = require('express'); var app = module.exports = express.createServer(); require('./config/enviroment.js')(app, express); require('./config/routes.js')(app); app.listen(3000); enviroment.js module.exports = function(app, express) { app.configure(function() { app.use(express.logger()); app.use(express.static(__dirname + '/public')); app.set('views', __dirname + '
  • 您如何部署Angular应用程序?(How do you deploy Angular apps?)
    问题 一旦进入生产阶段,您如何部署Angular应用程序? 到目前为止,我所见过的所有指南(甚至在angular.io上)都依靠可用于服务的Lite服务器和browserSync来反映更改-但是在完成开发后,如何发布该应用程序? 我是将所有已编译的.js文件导入index.html页面还是使用gulp进行压缩? 他们会工作吗? 生产版本中是否完全需要SystemJS? 回答1 您实际上是在将两个问题合而为一。 第一个是如何托管您的应用程序? 。 正如@toskv所提到的那样,它的问题实在太广泛了,无法回答,并且取决于许多不同的事物。 第二个是如何准备应用程序的部署版本? 。 您在这里有几种选择: 照原样部署。 就是这样-没有缩小,串联,名称修饰等操作。编译所有ts项目,将所有生成的js / css / ...源+依赖项复制到托管服务器,您就可以开始了。 使用特殊的捆绑工具(例如webpack或systemjs构建器)进行部署。 它们具有#1中缺少的所有可能性。 您可以将所有应用程序代码打包到HTML中引用的js / css / ...文件中。 systemjs器甚至允许您摆脱将systemjs包含在部署包中的需求。 您可以从Angular 8开始使用ng deploy从CLI部署应用程序。 ng deploy将需要与您选择的平台结合使用(例如@angular/fire )。
  • 如何在同一IP /服务器上的不同域中托管多个Node.js站点?(How do I host multiple Node.js sites on the same IP/server with different domains?)
    问题 我有一个绑定了单个IP的Linux服务器。 我想在此IP上的此服务器上托管多个Node.js站点,每个站点(显然)都具有唯一的域或子域。 我希望它们都在端口80上。 我有什么选择呢? 一个显而易见的解决方案似乎是让所有域都由一个node.js Web应用程序提供服务,该Web应用程序充当代理并传递到在唯一端口上运行的其他node.js应用程序。 回答1 选择以下之一: 使用其他一些服务器(例如nginx)作为反向代理。 使用node-http-proxy作为反向代理。 如果每个域都可以从相同的Connect / Express代码库和node.js实例提供服务,请使用vhost中间件。 回答2 Diet.js具有使用同一服务器实例托管多个域的非常简便的方法。 您只需为每个域调用一个新的server() 。 一个简单的例子 // Require diet var server = require('diet'); // Main domain var app = server() app.listen('http://example.com/') app.get('/', function($){ $.end('hello world ') }) // Sub domain var sub = server() sub.listen('http://subdomain
  • 我如何始终使用 express 提供相同的文件?(How do I always serve the same file with express?)
    问题 有什么办法可以始终提供相同的文件吗? 因此,如果他们访问 website.com/ajsdflkasjd,它仍然提供与 website.com/asdnw 相同的文件 我想使用带有节点的 express 来做到这一点。 我拥有的文件是静态 html 文件,而不是玉文件。 顺便说一句,如果您想知道,我想这样做的原因是我有一个 angularjs 应用程序可以为我处理所有路由。 所以,我需要做的就是提供那一页,它会处理其余的。 提前致谢! 回答1 新答案 const app= require('express')() // static file serve app.use(express.static(__dirname)) // not found in static files, so default to index.html app.use((req, res) => res.sendFile(`${__dirname}/index.html`)) app.listen(3000) 旧答案 var express = require('express'); var bodyParser = require('body-parser') var path = require('path') var app = express(); // url encoding app
  • Express 和 WebSocket 监听同一个端口(Express and WebSocket listening on the same port)
    问题 我有一个 app.js,用于在收到一些 POST 数据时触发两个事件: 将 POST 数据插入数据库使用 WebSocket 向客户端发送消息 这是app.js (只有重要的几行) var express = require('express'); var bodyParser = require('body-parser'); var server = require('./server'); var app = express(); var port = process.env.PORT || 3000; app.post('/server', server); app.listen(port, function(){ console.log('Slack bot listening'); }); 这是server.js (只有重要的行) var db = require('./DB'); var WebSocketServer = require('ws').Server; var insertData = function(req, res){ var wss = new WebSocketServer({server: server}); console.log('WebSocketServer created'); wss.on('connection'
  • node.js中公培训笔记大全(讲的一般,小白基础入门)
    day01 本阶段的授课内容为 ES6 2天-3天 NodeJS 2天-3天 express 2天-3天 webpack 1天 MySQL数据库 2天 实战项目 2天 今天的授课内容为 1.ES5-严格模式 ​ 严格模式是为了避免一些混杂模式的出现 混杂模式其实就是普通模式 我们之前写的代码 ​ 有的时候 在JS中使用的语法不需要那么守规则 ​ 严格模式的定义 在页首定义一个字符串 ‘use strict’ ​ 那么一下的代码执行严格模式 ​ 严格模式和常规的普通模式之间的区别是什么 ​ 1.在严格模式中定义变量必须使用变量声明符 // 定义严格模式 // 'use strict'; // 严格模式 定义变量必须加上变量声明符 age = 18; console.log(age); 'use strict'; // 如果说定义变量的时候 没有声明符 那么是修改变量 age = 18; console.log(age); ​ 2.在严格模式中不能删除变量 // 在严格模式中不能删除变量 // var num = 123; // console.log(delete num); // console.log(num); // 严格模式中 不能删除 'use strict'; var num1 = 456; console.log(delete num1); ​ 3.在严格模式中
  • 渲染原始HTML(Render raw HTML)
    问题 我想使用Express 3呈现原始.html页面,如下所示: server.get('/', function(req, res) { res.render('login.html'); } 这是我配置服务器以呈现原始HTML页面的方式(此过时的问题启发了这一点): server .set('view options', {layout: false}) .set('views', './../') .engine('html', function(str, options) { return function(locals) { return str; }; }); 不幸的是,使用此配置,页面将挂起,并且永远无法正确呈现。 我做错了什么? 如何在没有精美的渲染引擎(如Jade和EJS)的情况下使用Express 3渲染原始HTLM? 回答1 如果您实际上不需要将数据注入模板,则express中最简单的解决方案是使用静态文件服务器( express.static() )。 但是,如果您仍然想手动路由到页面的路由(例如,将示例“ /”映射到“ login.html”),则可以尝试使用res.sendFile()通过以下方式发送html文档: http://expressjs.com/api.html#res.sendfile 回答2 我想您想说的是:如何提供静态html文件