Nodejs&快递找不到公共文件夹

时间:2013-12-21 10:56:43

标签: node.js express

我的node.js应用找不到公用文件夹。我尝试过使用connect static和表达这个答案的静态:static files with express.js以及这个答案:File not found in 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...');

1 个答案:

答案 0 :(得分:6)

您的问题是由此引起的:

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

因为你在静态中间件之前声明了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);

(虽然您似乎可以跳过bodyParser中间件,因为您已经使用jsonurlencodedmultipart中间件; {{1}中间件只是围绕这三者的一个非常薄的包装)