不知道用了express.js的你有没有这样的疑问:
我简单看了一下connect源码,弄清楚了上面的这3个问题。
app.use(function middleware1(req, res, next) {
// middleware 1
next();
});
app.use(function middleware2(req, res, next) {
// middleware 2
next();
});
connect维护了一个中间件栈(middleware stack)
数据结构:栈(stack)
每次调用use,都会向这个应用(app)实例的栈(stack)推入一个带路径和处理函数的对象。
源码:
function createServer() {
function app(req, res, next){ app.handle(req, res, next); }
// ...
app.stack = []; // 注意这里
return app;
}
proto.use = function use(route, fn) {
var handle = fn;
var path = route;
// ...
// add the middleware
this.stack.push({ route: path, handle: handle });
return this;
};
// regular middleware
app.use(function (req, res, next) {
next(new Error('boom!'));
});
// error middleware
app.use(function onerror(err, req, res, next) {
// an error occurred!
});
JavaScript的函数的长度属性:length。
这么说可能比较绕,看下面这个例子就懂了。
例如
function test1(foo,bar){ }
test.length // 2
function test2(foo,bar,baz){ }
test.length // 3
connect正是通过中间件处理函数的形参长度来区分出普通中间件和错误中间件的。
function call(handle, route, err, req, res, next) {
var arity = handle.length;
var error = err;
var hasError = Boolean(err);
try {
if (hasError && arity === 4) {
// error-handling middleware
handle(err, req, res, next);
return;
} else if (!hasError && arity < 4) {
// request-handling middleware
handle(req, res, next);
return;
}
} catch (e) {
// replace the error
error = e;
}
// continue
next(error);
}
看了源码,官方文档对错误处理中间件描述skipping any error middleware above that middleware and any non-error middleware below的解释其实也懂了:
只能有一个异常处理中间件吗?
可以有多个。(官方文档+亲测)
app.use(logErrors)
app.use(clientErrorHandler)
app.use(errorHandler)
// error middleware one
app.use(function onerror(err, req, res, next) {
// an error occurred!
next(err) // 注意要这么写,next()进入不到下一个异常处理中间件
});
// error middleware two
app.use(function onerror(err, req, res, next) {
// an error occurred!
});
指代的是栈中的下一个中间件。
proto.handle = function handle(req, res, out) {
var index = 0;
var stack = this.stack;
// ...
function next(err) {
// next callback
var layer = stack[index++];
// call the layer handle
call(layer.handle, route, err, req, res, next);
}
next();
};
通过上面代码可以看出,每次调用next()函数,会执行index++,layer为middleware stack中的下一个中间件。
其中layer.handle来自于this.stack.push({ route: path, handle: handle });。
现在node的web框架有很多,除express 还有koa egg等等。 但它们本质上还是基于原生node框架的http。其实框架都大差不差,主要是观摩和学习。本篇文章主要记录下自己在node爬坑之路上的经历和收获
Node.js 的 Express 估计是那种你第一次接触,就会喜欢上用它的框架。因为它真的非常简单,直接。在当前版本上,一共才这么几个文件:
一般我们在做node web项目的时候,想使用我们平时常用的html模板,express默认使用jade模板,本身是没有HTML的,那么如何实现呢?上面实际上是调用了ejs的.renderFile()方法
这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history-api-fallback这个中间件来实现的。
还没用express写过server,先把部分源码撸了一遍,各位大神求轻拍。express入口文件在lib文件夹下的express.js,其向外界暴露了一些方法。
在项目开发当中有时候需要上传大文件,这时候你的代码写的完全正确,等了好半天文件上传完成了,但服务器突然在控制台报错一个错误,request entity too large,那对于这个棘手的问题改如何解决呢?
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!