天道酬勤,学无止境

“信任代理”在 express.js 中实际上做了什么,我需要使用它吗?(What does “trust proxy” actually do in express.js, and do I need to use it?)

问题

我正在编写一个位于 nginx 服务器后面的快速应用程序。 我正在阅读 express 的文档,它提到了“信任代理”设置。 它所说的只是

trust proxy 启用反向代理支持,默认禁用

我在这里阅读了一篇小文章,它解释了使用 nginx 在 Node 中的安全会话。

http://blog.nikmartin.com/2013/07/secure-sessions-in-nodejs-with-nginx.html

所以我很好奇。 仅在使用 HTTPS 时才将“信任代理”设置为 true 吗? 目前我的应用程序只是客户端和 nginx 之间的 HTTP。 如果我现在将其设置为 true,是否有任何我需要注意的副作用/影响? 现在将其设置为 true 有什么意义吗?

回答1

这在代理指南后面的快递中有详细解释

通过 app.enable('trust proxy') 启用“信任代理”设置,Express 将知道它位于代理后面,并且 X-Forwarded-* 标头字段可能是可信的,否则很容易被欺骗。

启用此设置有几个微妙的效果。 第一个是 X-Forwarded-Proto 可以由反向代理设置,以告诉应用程序它是 https 或只是 http。 该值由 req.protocol 反映。

这样做的第二个变化是 req.ip 和 req.ips 值将填充 X-Forwarded-For 的地址列表。

回答2

注释代码来解释信任代理的使用

    var express = require('express');

    var app = express();

    // Set the ip-address of your trusted reverse proxy server such as 
    // haproxy or Apache mod proxy or nginx configured as proxy or others.
    // The proxy server should insert the ip address of the remote client
    // through request header 'X-Forwarded-For' as
    // 'X-Forwarded-For: some.client.ip.address'
    // Insertion of the forward header is an option on most proxy software
    app.set('trust proxy', '127.0.0.1');


    app.get('/test', function(req, res){
      var ip = req.ip; // trust proxy sets ip to the remote client (not to the ip of the last reverse proxy server)
      if (ip.substr(0,7) == '::ffff:') { // fix for if you have both ipv4 and ipv6
        ip = ip.substr(7);
      }
      // req.ip and req.protocol are now set to ip and protocol of the client, not the ip and protocol of the reverse proxy server
      // req.headers['x-forwarded-for'] is not changed
      // req.headers['x-forwarded-for'] contains more than 1 forwarder when
      // there are more forwarders between the client and nodejs.
      // Forwarders can also be spoofed by the client, but 
      // app.set('trust proxy') selects the correct client ip from the list
      // if the nodejs server is called directly, bypassing the trusted proxies,
      // then 'trust proxy' ignores x-forwarded-for headers and
      // sets req.ip to the remote client ip address

      res.json({"ip": ip, "protocol": req.protocol, "headers": req.headers['x-forwarded-for']});
    });

// in this example the reverse proxy is expected to forward to port 3110
var port = 3110;
app.listen(port);
// test through proxy: http://yourproxyserver/test, req.ip should be your client ip
// test direct connection: http://yournodeserver:3110/test, req.ip should be your client ip even if you insert bogus x-forwarded-for request headers
console.log('Listening at http://localhost:' + port);
回答3

TLDR :应用程序设置信任代理只是为了在快速应用程序位于代理后面时使用。 在有代理时启用此功能有助于通过众所周知的标头(主要是 X-Forwarded-For、X-Forwarded-Proto)解析以下属性

  • 请求文件
  • 请求.主机名
  • 请求协议

更多细节

当我在寻找关于express-session 的信任代理真正做的事情时,我最终来到了这里。 没有一个答案对我有帮助。

默认值 - false(禁用)

IMO 最好的文档位于应用程序设置

信任代理

指示应用程序位于前置代理之后,并使用 X-Forwarded-* 标头来确定客户端的连接和 IP 地址。 注意:X-Forwarded-* 标头很容易被欺骗并且检测到的 IP 地址不可靠。

启用后,Express 会尝试确定通过前置代理或一系列代理连接的客户端的 IP 地址。 req.ips属性包含客户端连接的 IP 地址数组。 要启用它,请使用信任代理选项表中描述的值。

trust proxy设置是使用 proxy-addr 包实现的。 有关更多信息,请参阅其文档。

注意:子应用程序将继承此设置的值,即使它具有默认值。

ps - 如果您想了解这对 express-session 有何帮助,则需要启用信任代理才能获取req.secure的正确值

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Node.js express-session代理选项有什么作用?(Node.js express-session what does the proxy option do?)
    问题 app.use(session( { ... proxy: true, resave: true, saveUninitialized: true } )); 我找到了关于快速会话的教程,并且它们具有proxy:true选项。 我可以保留为真吗? 这是做什么的? 包含它更好吗? 我知道什么是代理,但是我真的不明白为什么这是一个选择? 回答1 好的手册指出: 设置安全cookie(通过“ X-Forwarded-Proto”标头)时,请信任反向代理。 这是指客户端不通过反向代理直接连接到您的节点服务器的情况。 例如,客户端连接到NGINX Web服务器,该服务器将请求转发到Node服务器。 在这种情况下,NGINX是反向代理。 在反向代理设置中,客户端通过HTTPS与反向代理进行通信也是很常见的,但是该代理使用纯HTTP与Node服务器进行通信。 当您配置会话中间件以使用所谓的“安全cookie” (此处记录)时,这是一个问题。 会话中间件不允许这些cookie通过纯HTTP发送,但要求它们通过HTTPS发送。 如果反向代理通过HTTP与Node服务器通信,则意味着您将无法使用安全cookie。 为了解决此问题,反向代理会将X-Forwarded-Proto标头设置为其转发的每个请求。 它告诉节点服务器请求的原始协议是什么,而不管反向代理连接到节点服务器的方式如何。
  • Express.js:如何获取远程客户端地址(Express.js: how to get remote client address)
    问题 我不完全了解如何获取远程用户IP地址。 假设我有一个简单的请求路由,例如: app.get(/, function (req, res){ var forwardedIpsStr = req.header('x-forwarded-for'); var IP = ''; if (forwardedIpsStr) { IP = forwardedIps = forwardedIpsStr.split(',')[0]; } }); 以上方法获取真实用户IP地址是否正确,还是有更好的方法? 代理呢? 回答1 如果您是在像NGiNX这样的代理服务器上运行,或者只有什么,那么您应该检查'x-forwarded-for' : var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 如果代理不是“您的”,那么我将不信任'x-forwarded-for'标头,因为它可能是被欺骗的。 回答2 尽管@alessioalex的答案有效,但Express的“在代理之后快速表达”部分提供了另一种方法-指南。 将app.set('trust proxy', true)到您的快速初始化代码中。 当您想要获取远程客户端的IP时,可以按通常的方式使用req.ip或req.ips (就像没有反向代理一样) 可选阅读:
  • 什么是Express.js?(What is Express.js?)
    问题 我是Node.js的学习者。 什么是Express.js? Node.js的目的是什么? 为什么我们实际上需要Express.js? 与Node.js一起使用对我们有什么用? 什么是Redis? 它是否随Express.js一起提供? 回答1 这过于简化了,但是Express.js对Node.js来说就像Ruby on Rails或Sinatra对Ruby一样。 Express 3.x是一个轻量级的Web应用程序框架,可帮助您将Web应用程序组织到服务器端的MVC架构中。 您可以为模板语言使用多种选择(例如EJS,Jade和Dust.js)。 然后,您可以将MongoDB之类的数据库与Mongoose一起使用(用于建模)为Node.js应用程序提供后端。 Express.js基本上可以帮助您管理从路由到处理请求和视图的所有内容。 Redis是一个键/值存储-通常用于Node.js应用程序中的会话和缓存。 您可以使用它做更多的事情,但这就是我使用它的目的。 我将MongoDB用于更复杂的关系,例如订单项<->订单<->用户关系。 有一些模块(最著名的是connect-redis)可以与Express.js一起使用。 您将需要在服务器上安装Redis数据库。 这是Express 3.x指南的链接:https://expressjs.com/en/3x/api.html 回答2 1
  • 在带有Node和Express的IE10中使用CORS的安全错误(Security error using CORS in IE10 with Node and Express)
    问题 我正在构建一个托管在http://example.com上的Backbone应用程序,该应用程序使用托管在https://api.example.com上的API。 对于API,我将Node.js与Express.js框架一起使用。 我的CORS解决方案似乎可以在除IE之外的所有主流浏览器中使用(甚至在IE10中失败)。 从IE10启动请求后,该请求将永远不会到达API服务器。 据我所知,请求甚至没有被发送。 当我使用IE10的开发人员工具检查请求时,请求标头和响应标头均为空白。 当从任何其他浏览器发送请求时,将接收到该请求并正确生成响应。 这是我在控制台中看到的错误: SCRIPT 7002: XMLHttpRequest: Network Error 0x4c7, The operation was canceled by the user. 该请求使用jQuery: $.ajax({ url: apiRoot + "/endpoint", success: function(response) { // Omitted irrelevant code } }); 根据本文的介绍,CORS默认情况下在IE中处于禁用状态,必须启用: Internet Explorer忽略Access-Control-Allow标头,并且默认情况下禁止Internet区域的跨域访问。
  • 如何决定何时使用Node.js?(How to decide when to use Node.js?)
    问题 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我对这种东西是陌生的,但是最近我已经听到很多关于Node.js有多出色的信息。 考虑到总体上我非常喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js。 我想到的Web应用程序就像Bitly一样-需要一些内容,然后将其存档。 从过去几天我所做的所有作业中,我获得了以下信息。 Node.js 是一种命令行工具,可以作为常规Web服务器运行,并且可以运行一个JavaScript程序利用强大的V8 JavaScript引擎需要同时做几件事时非常好是基于事件的,因此所有出色的类似于Ajax的工作都可以在服务器端完成让我们在浏览器和后端之间共享代码让我们与MySQL对话 我遇到的一些来源是: 深入Node.js –简介和安装了解NodeJS 示例节点(Archive.is) 让我们来制作一个Web应用程序:NodePad 考虑到Node.js几乎可以在亚马逊的EC2实例上即开即用地运行,我试图了解Node.js需要哪种类型的问题,而不是像PHP,Python和Ruby这样的强大之王。 我知道这确实取决于一个人在某种语言上的专业知识,但是我的问题更多地归结为以下一般类别:什么时候使用特定框架,它特别适合什么类型的问题? 回答1 在总结Node
  • ExpressJS如何构建应用程序?(ExpressJS How to structure an application?)
    问题 我正在使用NodeJS的ExpressJS Web框架。 使用ExpressJS的人将他们的环境(开发,生产,测试...),路线等放置在app.js 。 我认为这不是一个好方法,因为当您拥有大型应用程序时,app.js太大了! 我想要这样的目录结构: | my-application | -- app.js | -- config/ | -- environment.js | -- routes.js 这是我的代码: app.js var express = require('express'); var app = module.exports = express.createServer(); require('./config/environment.js')(app, express); require('./config/routes.js')(app); app.listen(3000); config / environment.js module.exports = function(app, express){ app.configure(function() { app.use(express.logger()); }); app.configure('development', function() { app.use(express
  • 由于MIME类型未加载样式表(Stylesheet not loaded because of MIME-type)
    问题 我正在使用gulp进行编译和浏览器同步以使浏览器与我的更改保持同步的网站上工作。 gulp任务可以正确编译所有内容,但是在网站上,我看不到任何样式,并且控制台显示以下错误消息: 拒绝应用来自“ http:// localhost:3000 / assets / styles / custom-style.css”的样式,因为它的MIME类型('text / html')不是受支持的样式表MIME类型,并且启用了严格的MIME检查。 现在,我真的不明白为什么会这样。 HTML包含这样的文件(我很确定是正确的): <link rel="stylesheet" type="text/css" href="assets/styles/custom-style.css"/> 样式表目前是Bootstrap和超赞字体之间的合并(尚无自定义)。 路径也是正确的,因为这是文件夹结构: index.html assets |-styles |-custom-style.css 但是,我不断收到错误消息。 会是什么呢? 这是gulp / browsersync的东西(也许是设置吗?)? 回答1 对于Node.js应用程序,请检查您的配置: app.use(express.static(__dirname + '/public')); 请注意, /public末尾没有正斜杠
  • 在Heroku上获取客户的真实IP地址(Get client's real IP address on Heroku)
    问题 在Heroku Cedar上,我想获取客户端的IP。 第一次尝试: ENV['REMOTE_ADDR'] 当然,这是行不通的,因为所有请求都是通过代理传递的。 因此,替代方法是使用: ENV['HTTP_X_FORWARDED_FOR'] 但这不是很安全,是吗? 如果它只包含一个值,我接受这个。 如果它包含多个值(以逗号分隔),则可以采用第一个值。 但是,如果有人操纵此值怎么办? 我无法像使用ENV['REMOTE_ADDR']那样信任ENV['HTTP_X_FORWARDED_FOR'] ENV['REMOTE_ADDR'] 。 而且,也没有我可以使用的受信任代理的列表。 但是必须始终有某种方法可以可靠地获取客户端的IP地址。 你认识一个人吗? Heroku在他们的文档中将X-Forwarded-For描述为“连接到Heroku路由器的客户端的原始IP地址”。 听起来好像Heroku可以用原始远程IP覆盖X-Forwarded-For 。 这样可以防止欺骗,对吗? 有人可以验证吗? 回答1 从Heroku当时的安全总监Jacob处获得: 路由器不会覆盖X-Forwarded-For ,但可以保证真实的原点始终是列表中的最后一项。 这意味着,如果您以常规方式访问Heroku应用程序,则只会在X-Forwarded-For标头中看到您的IP地址: $ curl http:/
  • 呈现基本的 HTML 视图?(Render basic HTML view?)
    问题 我有一个基本的 node.js 应用程序,我正在尝试使用 Express 框架启动它。 我有一个views文件夹,其中有一个index.html文件。 但是我在加载 Web 浏览器时收到以下错误。 错误:找不到模块“html” 下面是我的代码。 var express = require('express'); var app = express.createServer(); app.use(express.staticProvider(__dirname + '/public')); app.get('/', function(req, res) { res.render('index.html'); }); app.listen(8080, '127.0.0.1') 我在这里缺少什么? 回答1 您可以让 jade 包含一个纯 HTML 页面: 在视图/index.jade include plain.html 在视图/plain.html <!DOCTYPE html> ... 而 app.js 仍然可以渲染 jade: res.render(index) 回答2 这些答案中有许多已经过时了。 使用express 3.0.0和3.1.0,可以进行以下工作: app.set('views', __dirname + '/views'); app.engine('html'
  • Express.js req.body未定义(Express.js req.body undefined)
    问题 我将其作为Express服务器的配置 app.use(app.router); app.use(express.cookieParser()); app.use(express.session({ secret: "keyboard cat" })); app.set('view engine', 'ejs'); app.set("view options", { layout: true }); //Handles post requests app.use(express.bodyParser()); //Handles put requests app.use(express.methodOverride()); 但是当我在路线中要求req.body.something ,仍然出现一些错误,指出该body is undefined 。 这是使用req.body的路由的示例: app.post('/admin', function(req, res){ console.log(req.body.name); }); 我读到这个问题是由于缺少app.use(express.bodyParser()); 但如您所见,我在路线前称呼它。 有什么线索吗? 回答1 2020年7月更新 express.bodyParser()不再捆绑为express的一部分。
  • 使用nginx作为HTTPS正向代理服务器(七层透传代理、中间人代理)
    【前言】 在讲解nginx正向代理https之前,我们先来解答几个小疑问。 1、nginx是什么? Java同学肯定知道apache服务器,一个很牛,但是也很庞大的web服务器。能当web服务器的不仅仅只有apache,还有一个小巧轻快,高性能的家伙,它就是nginx。 百度百科的解释是:nginx是一个高性能的http和反向代理服务器,同时也提供了imap/pop3/smtp服务。其特点是占有内存少,并发能力强。在咱们大中华大陆地区,百度、京东、新浪、网易、腾讯、淘宝都用了nginx,可见它有多受大家的欢迎。 大家都知道它是一个反向代理服务器,其实它也可以作为一个正向代理服务器。虽然nginx官方并没有提供http connect方法,但是nginx扩展性特别好,有大佬造出了ngx_http_proxy_connect_module模块(点击可以去到对应的github)来支持http connet方法,如此一来,它就可以正向代理http以及https了。本文着只讲nginx正向代理https,其余的等有时间再更新吧。 2、什么是nginx正反向代理? 正向代理:客户发送请求给代理服务器,代理服务器代替客户把请求发送给服务器,即正向代理是代理的客户端。 反向代理:代理服务器将收集到的请求分发给服务器,服务器处理完请求将结果返回给代理服务器,再由代理服务器将结果返回给客户端
  • Angular js和Express js之间的基本区别和相似之处是什么? [关闭](What are the basic differences and similarities between Angular js and Express js? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 所以我对Angular js vs Express js的目标有些困惑。 根据我的理解,我们使用Node.js来提供Angular js的服务,但是我们并不完全受限于或被迫使用Node.js来为其提供服务。 另一方面,Express js似乎完成了与更传统的MVC框架类似的任务。 那么Angular Js是一种非特定于服务器的MVC框架吗? 这是否限制了Angular js后端服务器功能或易用性? 回答1 表示 Express是一个Web框架,其灵感来自Ruby项目“ Sinatra”。 它是Node中许多Web框架之一 AngularJs AngularJS是一个MVC框架,它定义了许多概念来正确组织Web应用程序。 您的应用程序定义了可以相互依赖的模块。 它通过将指令附加到具有新属性或标记和表达式的页面上来增强HTML,以便直接在HTML中定义功能非常强大的模板。 它还将应用程序的行为封装在控制器中,这要归功于依赖注入。 AngularJS帮助您非常轻松地构建和测试Javascript代码。 回答我看到的你的评论。 因此,您会说它们是出于客户端和服务器端实现的不同目的,因此是互斥的,还是您看到一种场景
  • var express = require('express'); var app = express(),什么是express()?? 是方法还是构造函数? 它从何而来(var express = require('express'); var app = express(), What is express()?? is it a method or a constructor? Where does it come from)
    问题 var express = require('express'); var app = express(); 这就是我们创建快速申请的方式。 但是,这是什么“ express()”? 是方法还是构造函数? 它从何而来?? 回答1 它是方法还是构造函数? 两者都不; 这是一个函数,尽管如果您说“方法”,我认为没有人会给您带来麻烦。 方法是附加到对象的功能。 在JavaScript中,方法只是大多是你通过对象属性引用功能。 (更新:从ES2015开始,如果您使用方法语法来创建它们,则它们的数量要略多于此,因为它们可以访问super 。) JavaScript中的构造函数是您通过new运算符调用的函数。 即使其他函数可能创建事物,我们通常也不会将它们称为“构造函数”以避免混淆。 有时它们可​​能是“创建者”或“构建者”功能。 它从何而来? ExpressJS是NodeJS模块; express是模块的名称,也是我们通常给变量的名称,该变量用于在代码中引用其主要功能,例如您引用的变量。 NodeJS提供了require函数,其功能是加载模块并允许您访问其导出。 (您不必调用变量express ,你可以做var foo = require('express');以及使用foo代替,但惯例是,你使用模块的名称,或只使用一个部分模块,以使用模块文档中定义的零件名称。) 回答2
  • 为什么节点中的PassportJS无法在注销时删除会话(Why is PassportJS in Node not removing session on logout)
    问题 我无法让我的系统使用PassportJS注销。 似乎正在调用注销路由,但它并未删除会话。 如果用户未以特定的路线登录,我希望它返回401。 我打电话给authenticateUser来检查用户是否登录。 非常感谢! /******* This in index.js *********/ // setup passport for username & passport authentication adminToolsSetup.setup(passport); // admin tool login/logout logic app.post("/adminTool/login", passport.authenticate('local', { successRedirect: '/adminTool/index.html', failureRedirect: '/', failureFlash: false }) ); app.get('/adminTool/logout', adminToolsSetup.authenticateUser, function(req, res){ console.log("logging out"); console.log(res.user); req.logout(); res.redirect('/'); }); // ***
  • socket.io和websockets之间的区别(Differences between socket.io and websockets)
    问题 node.js中的socket.io和websockets有什么区别? 它们都是服务器推送技术吗? 我唯一感觉到的区别是 socket.io允许我通过指定事件名称来发送/发送消息。 对于socket.io,来自服务器的消息将到达所有客户端,但是对于websockets中的消息,我被迫保留所有连接的数组并循环遍历,以将消息发送给所有客户端。 另外,我想知道为什么Web检查器(例如Chrome / firebug / fiddler)无法从服务器捕获这些消息(来自socket.io/websocket)? 请澄清一下。 回答1 它的优点是,它简化了如#2中所述的WebSockets的使用,并且可能更重要的是,如果浏览器或服务器不支持WebSockets,它可以将故障转移到其他协议。 我将避免直接使用WebSocket,除非您非常熟悉Web套接字在什么环境下不起作用,并且您能够解决这些限制。 这对WebSockets和Socket.IO都是不错的阅读。 http://davidwalsh.name/websocket 回答2 误解 关于WebSocket和Socket.IO的常见误解很少: 第一个误解是使用Socket.IO明显比使用WebSocket容易得多,WebSocket似乎并非如此。 请参阅下面的示例。 第二个误解是浏览器未广泛支持WebSocket。 有关更多信息
  • 如何处理Node.js中的循环依赖关系(How to deal with cyclic dependencies in Node.js)
    问题 我最近一直在使用nodejs,并且仍然要处理模块系统,因此很抱歉这是一个明显的问题。 我想要的代码大致如下所示: a.js (主文件与节点一起运行) var ClassB = require("./b"); var ClassA = function() { this.thing = new ClassB(); this.property = 5; } var a = new ClassA(); module.exports = a; b.js var a = require("./a"); var ClassB = function() { } ClassB.prototype.doSomethingLater() { util.log(a.property); } module.exports = ClassB; 我的问题似乎是我无法从ClassB实例中访问ClassA实例。 有没有正确/更好的方法来构造模块来实现我想要的? 有没有更好的方法可以在模块之间共享变量? 回答1 尽管node.js确实允许循环require依赖项,但是您已经发现它可能很杂乱,您最好重组代码以使其不需要。 也许创建一个使用其他两个类来完成您需要的类的第三类。 回答2 尝试在module.exports上设置属性,而不是完全替换它。 例如, module.exports.instance =
  • 表达下一个功能,它的真正作用是什么?(Express next function, what is it really for?)
    问题 一直在努力寻找next()方法的作用的良好描述。 在Express文档中,它说next('route')可用于跳转到该路由并跳过其间的所有路由,但是有时调用next不带参数。 有人知道一个很好的教程等描述next功能吗? 回答1 没有参数的next()表示“开个玩笑,我实际上并不想处理这个问题”。 它返回并尝试查找将匹配的下一条路线。 这很有用,例如,如果您想使用某种带有URL插件的页面管理器以及许多其他功能,但这是一个示例。 app.get('/:pageslug', function(req, res, next){ var page = db.findPage(req.params.pageslug); if (page) { res.send(page.body); } else { next(); } }); app.get('/other_routes', function() { //... }); 组成代码的代码应检查数据库中是否存在具有特定ID标记的页面。 如果找到一个渲染器! 如果找不到,则忽略此路由处理程序并检查其他路由处理程序。 因此,不带参数的next()可以假装您没有处理该路由,以便其他人可以选择它。 或使用app.all('*')命中柜台。 这使您可以执行一些共享的设置代码,然后转到其他路线以执行更具体的操作。 app.all('*'
  • 无法识别“ Express”命令(Windows)('Express' is not recognized command (windows))
    问题 好的,我正在Windows(7)上运行节点。 使用npm,我刚刚将模块安装到d:\目录。 因此,我的文件结构如下所示: D:\ -myproject -node_modules -.bin -express 但是,当我在此“ myproject”目录中时,例如,我似乎无法运行“ express”: D:\myproject\express site 'express' is not recognized as an internal or external command, operable program or batch file. 我做错什么了吗? 回答1 我的猜测是您没有在全球范围内安装Express。 您可以使用以下命令(请参阅http://expressjs.com/guide.html)在全球范围内安装Express(因此可以在PATH中使用): npm install -g express 它的安装方式仅在安装它的文件夹中可用,并且该方法没有任何问题。 在全球范围内使用它几乎没有优势。 如果Express不在您的PATH中,则可以通过输入它的完整路径来运行它: \myproject\node_modules\.bin\express.cmd 回答2 尝试: npm install -g express-generator@3 这为我解决了问题。 编辑
  • 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')调用。 如此看来,如果它已经以这种方式设置,那么它应该保持这种方式。 重新排列代码以便可以看到手写笔更改后
  • 人体解析器与表达有什么关系?(What does body-parser do with express?)
    问题 我不明白为什么在Express应用程序中需要body-parser ,因为我们无需使用body-parser就可以获取数据。 它实际上是做什么的以及如何做的? 回答1 要在Express.js版本4和更高版本中处理HTTP POST请求,您需要安装称为body-parser中间件模块。 body-parser提取传入请求流的整个主体部分,并将其公开在req.body 。 中间件是Express.js的一部分,但现在您必须单独安装。 此body-parser模块解析使用HTTP POST请求提交的JSON,缓冲区,字符串和URL编码的数据。 如下所示,使用NPM安装body-parser 。 npm install body-parser --save 在2019年4月2日中进行编辑:在express@4.16.0中,与express捆绑在一起的body-parser中间件。 有关更多详细信息,请参阅此 回答2 是的,没有body-parser我们就可以工作。 当您不使用它时,您将得到原始请求,并且您的正文和标头不在request参数的根对象中。 您将必须单独操作所有字段。 或者,您可以使用body-parser ,因为快递团队正在维护它。 身体分析器可以为您做什么:简化了请求。 使用方法:这是示例: 安装npm install body-parser --save