Javascript Express中更好的中间件链接
这是我的Express配置代码:Javascript Express中更好的中间件链接,javascript,node.js,express,Javascript,Node.js,Express,这是我的Express配置代码: var server = express() .use(express.cookieParser()) .use(express.session({secret: buffer.toString('hex')})) .use(express.bodyParser()) .use(express.static('./../')); server.use(server.router); 很烦人的是,最后一次使用没有像其他人一样被锁
var server = express()
.use(express.cookieParser())
.use(express.session({secret: buffer.toString('hex')}))
.use(express.bodyParser())
.use(express.static('./../'));
server.use(server.router);
很烦人的是,最后一次使用没有像其他人一样被锁住
如何对Express中间件定义进行完整链接?Express每次都返回该定义,因此始终可以链接。可链接性问题源于不必要地使用server.useserver.router,当通过server.get、server.post等添加第一条非中间件路由时,express会自动为您完成此操作。这可能会,虽然这是一个常见的混淆点和问题,但大多数问题都来自于执行server.userserver.router,而不是让路由器在默认情况下运行,因为默认情况下路由器几乎总是正确的位置。下面是论坛:
正确订购服务器。使用调用设置中间件
您与server.get'/home'和其他HTTP方法函数的特定路由
任何错误处理、404中间件等
Express将在1之后但在2之前添加路由器,一切都会好起来
在您声明的注释中,如果省略server.router行,您将无法访问req.session。对不起,事实并非如此。下面是一个完整的工作express应用程序,它显示了会话中间件之前的一个中间件req.session undefined,以及会话中间件之后的另一个中间件req.session undefined
var express = require('express');
var server = express();
server.use(function (q,r,n) {console.log('Before cookie:', q.session);n();});
server.use(express.cookieParser());
server.use(function (q,r,n) {console.log('after cookie:', q.session);n();});
server.use(express.session({secret: 'SEKRET'}));
server.use(function (q,r,n) {console.log('after session:', q.session);n();});
server.get('/', function (q,r,n) {r.send("you got slashed");});
server.listen(3000);
运行它,您将在控制台上看到这一点
Before cookie: undefined
after cookie: undefined
after session: { cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
但是,如果您询问为什么不能在定义服务器变量的同一语句中使用服务器变量作为函数参数,这就是JavaScript的工作方式,与express没有任何关系。你不能这样做:
var foo = console.log(foo.bar);
因为在整个语句完成之前,foo是未定义的
FWIW我的观点是,像这样的可链接代码是可疑的。它对调试器和断点不友好,作为一种一流的语言功能不受支持,并且与未插入的每行和app.useapp.router相比,它并没有真正为您节省任何字符,但就这样吧。express每次都会返回它,因此始终是可链接的。可链接性问题源于不必要地使用server.useserver.router,当通过server.get、server.post等添加第一条非中间件路由时,express会自动为您完成此操作。这可能会,虽然这是一个常见的混淆点和问题,但大多数问题都来自于执行server.userserver.router,而不是让路由器在默认情况下运行,因为默认情况下路由器几乎总是正确的位置。下面是论坛:
正确订购服务器。使用调用设置中间件
您与server.get'/home'和其他HTTP方法函数的特定路由
任何错误处理、404中间件等
Express将在1之后但在2之前添加路由器,一切都会好起来
在您声明的注释中,如果省略server.router行,您将无法访问req.session。对不起,事实并非如此。下面是一个完整的工作express应用程序,它显示了会话中间件之前的一个中间件req.session undefined,以及会话中间件之后的另一个中间件req.session undefined
var express = require('express');
var server = express();
server.use(function (q,r,n) {console.log('Before cookie:', q.session);n();});
server.use(express.cookieParser());
server.use(function (q,r,n) {console.log('after cookie:', q.session);n();});
server.use(express.session({secret: 'SEKRET'}));
server.use(function (q,r,n) {console.log('after session:', q.session);n();});
server.get('/', function (q,r,n) {r.send("you got slashed");});
server.listen(3000);
运行它,您将在控制台上看到这一点
Before cookie: undefined
after cookie: undefined
after session: { cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true } }
但是,如果您询问为什么不能在定义服务器变量的同一语句中使用服务器变量作为函数参数,这就是JavaScript的工作方式,与express没有任何关系。你不能这样做:
var foo = console.log(foo.bar);
因为在整个语句完成之前,foo是未定义的
FWIW我的观点是,像这样的可链接代码是可疑的。它对调试器和断点不友好,作为一流的语言功能不受支持,与未插入的每一行和app.useapp.router相比,它并没有真正为您节省任何字符,但就这样吧。是的,我在第一次修订和更新后不久就发现了这一点。您混淆了会话处理和路由,这在很大程度上是不相关的。以下是自动使用路由器的代码:。会话中间件之后的任何中间件都可以访问req.session。只要确保你所有的香草app.use调用都在app.get或app.post等方法之前,你就没事了。我想这已经改变了。过去是最后一个路由器,现在路由器是在你的第一个应用之前添加的。get/post/put/etc call.Hum。我所有的app.use都位于app.get或app.post之前。但这只定义了处理程序。这真的会影响订购吗?您的语句会话中间件之后的任何中间件都可以访问req.session。我的情况不是这样。谢谢你的努力。我没有正确解释req.session对象没有正确填充的意思。基本上,我确实有req.session.cookie,但我在app.post处理程序中设置的任何其他属性(如req.session.user)都不会显示在中间件处理程序中。请看我的另一个问题是的,我在第一次修订和更新后不久就发现了这一点
会话处理和路由,它们在很大程度上是不相关的。以下是自动使用路由器的代码:。会话中间件之后的任何中间件都可以访问req.session。只要确保你所有的香草app.use调用都在app.get或app.post等方法之前,你就没事了。我想这已经改变了。过去是最后一个路由器,现在路由器是在你的第一个应用之前添加的。get/post/put/etc call.Hum。我所有的app.use都位于app.get或app.post之前。但这只定义了处理程序。这真的会影响订购吗?您的语句会话中间件之后的任何中间件都可以访问req.session。我的情况不是这样。谢谢你的努力。我没有正确解释req.session对象没有正确填充的意思。基本上,我确实有req.session.cookie,但我在app.post处理程序中设置的任何其他属性(如req.session.user)都不会显示在中间件处理程序中。请看我的另一个问题