`express.static()`继续路由我的文件

an *_*wig 10 static-files node.js express

在处理快速项目时,我正在尝试使用express.Router对象来处理我的应用程序路由.在我的主应用程序文件中,我为所有静态文件(css,javascript,html)添加了静态路由.

app.js

var express = require('express');
var io = require('socket.io')(app);
var bodyParser = require('body-parser');
var router = require('./include/router');

var app = express();
app.use('/', router);
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());

io.on('connection', function(socket) {

});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

router.js

var express = require('express');
var path = require('path');

var router = express.Router();

router.get('/', function(req, res) {
  res.sendFile('/html/index.html');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

当我尝试访问时,localhost:3000我得到404显示Error: ENOENT, stat 'C:\html\index.html'

此外,当我尝试直接访问静态路由(http://localhost:300/html/index.html我相信),但这给了我Cannot GET /html/index.html.

这是我的公用文件夹的树

public
????css
????hmtl
|   ????index.html
????img
????js

我错了吗?我该如何解决?

Ser*_*ino 14

您必须反转路由器的顺序

app.use('/', router);
app.use(express.static(__dirname + '/public'));
Run Code Online (Sandbox Code Playgroud)

意味着您的路由器将首先被调用,如果没有中间件处理请求,则express将调用静态文件,因此,如果您先将静态中间件放入,则express将首先处理静态文件.

还建议先放置静态中间件.

对于你的问题,你应该试试这个:

app.use(express.static(__dirname + '/public/html'));
app.use(express.static(__dirname + '/public'));
app.use('/', router);
Run Code Online (Sandbox Code Playgroud)

Express将首先在public/html文件夹上尝试静态文件,然后在其余部分(包括public/html)上,我更喜欢将html文件放在公用文件夹的根目录上,或者可能放在不同的文件夹上(例如public-html,static-html) )

  • 由于某种原因,当在路由器中使用带有 `mergeParams:true` 选项的参数时,这似乎不起作用,路由器将尝试在当前路由下提供静态文件,如 `/myuri/js/main.js` ,如下所述:http ://stackoverflow.com/questions/15128849/using-multiple-parameters-in-url-in-express (2认同)
  • @loretoparisi 这正是我的问题,我找不到任何解决方案。我的带有参数的路由不会像其他路由一样加载到 css 和 js 源中。它尝试加载路径非参数化部分的目录。就像如果路由是“/newItem:id”一样,它会查找名为 newItem 的文件夹。为什么要这样做?? (2认同)