Nodejs&express找不到公用文件夹

jus*_*ser 0 node.js express

我的node.js应用程序找不到公用文件夹.我已经尝试过使用connect static和表达静态来回答:带有express.js的静态文件以及这个答案:在Node.js中找不到文件

但我仍然无法让它发挥作用.我得到了我试图显示的页面内容,但没有任何指向css和js文件的链接.

有任何想法吗?这是我的app.js文件.

var express = require('express'),
post = require('./routes/posts'),
web = require('./routes/web'),
http = require('http'),
stylus = require('stylus'),
nib = require('nib'),
path = require('path');

var app = express();

function compile(str, path) {
    return stylus(str).set('filename', path).use(nib());
}

app.configure(function () {

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
app.use(app.router);
app.use(stylus.middleware({src: __dirname + '/public', compile: compile}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.bodyParser({ keepExtensions: true, uploadDir: __dirname + '/upload/photos' }));
});

//app.use(app.router);

//Web
app.get('/',        web.frontPage); 

app.post('/posts',           post.findAllPosts);
app.post('/posts/:id',       post.findPostById);
app.post('/postAdd',          post.addPost);
app.put('/posts/:id',       post.updatePost);
app.delete('/posts/:id',    post.deletePost); 

app.get('*', function(req, res){
    res.render('404');
});

http.createServer(app).listen(80);
console.log('Listening on port 80...');
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 6

你的问题是由这个引起的:

app.get('*', function(req, res){
  res.render('404');
});
Run Code Online (Sandbox Code Playgroud)

因为您在静态中间件之前声明了app.router中间件(它处理了全部路由),路由器也会收到静态文件的所有请求,如果它们没有被任何其他路由处理,它将生成一个404.

解决方案是将静态中间件移到路由器之前.同样也需要应用于Stylus中间件和bodyParser中间件,以确保它们您的路由之前被调用:

app.use(stylus.middleware({src: __dirname + '/public', compile: compile}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.bodyParser({ keepExtensions: true, uploadDir: __dirname + '/upload/photos' }));
app.use(app.router);
Run Code Online (Sandbox Code Playgroud)

(虽然它似乎可以跳过bodyParser中间件,因为你正在使用的json,urlencodedmultipart中间件已;在bodyParser中间件仅仅是这三个围绕一个非常薄的包装)