node.js - express中一个诡异的现象
高洛峰
高洛峰 2017-04-17 11:15:27
[Node.js讨论组]
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文件吗?如果有就加载没有的话再走路由?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
高洛峰

首先,基础是“王子亭”说的,中间件是按照顺序执行的,所以首先匹配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")
巴扎黑

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号