首页 > express中一个诡异的现象

express中一个诡异的现象

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
// app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

/// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

上面是用express初始化的代码,下面是index.js的代码

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
  console.log("index") ;
  res.render('index');
});

module.exports = router;

我访问http://localhost:3000/的时候直接返回的是public/index.html,没有通过router,也就是说console.log('index')这句没打印出来,如果把static那句放到路由设置后面的话就有打印,不知道是怎么回事?麻烦大家帮忙解答一下

追加:如果我把public文件夹底下的index.html文件移除掉就可以通过路由了,难道express会先查看public底下有没有index.html文件吗?如果有就加载没有的话再走路由?


app.use('/', routes); 放到 app.use(express.static(path.join(__dirname, 'public'))); 前面,express 是按顺序匹配路由的。


首先,基础是“王子亭”说的,中间件是按照顺序执行的,所以首先匹配static,只有到路径匹配不到并且response没有end,才会继续往后执行。至于为什么 '/' 会匹配到 'index.html'则如下:

express的static middleware “serve-static” 使用的是Connect的输出模块send ,这个模块在处理路径时是下面的逻辑:

见https://github.com/visionmedia/send/blob/master/lib/send.js 104行:

 this._index = options.index !== undefined
    ? normalizeIndex(options.index)
    : ['index.html']

默认的就是index.html,至于后续判断这个文件是否存在,stream输出有兴趣可以自己看代码

那么这个问题怎么处理呢?不建议改变app.use的顺序,而是不用保留public下面的index.html,或者使用static中间件的时候在前面加一层路径,避免类似的混淆:

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

//jade模板中嵌入静态资源时加上static这层路径:
script(src="/static/main.js")
【热门文章】
【热门文章】