从express.js提供图像的问题

时间:2014-01-03 00:30:06

标签: javascript node.js express

我在快递应用中提供.png图片时出现问题。我认为路由器设置有问题,因为它试图渲染页面而不是提供静态文件。设置如下:

// app.js
// Module dependencies
var express = require('express'),
    http = require('http'),
    path = require('path'),
    session = require('./middlewares/session');

// Create server
var app = module.exports = app ? app : express();

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');
app.set('view options', { layout: true });

app.use(express.static(path.join(__dirname, '../../public')));
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.errorHandler());
app.use(express.responseTime());
app.use(express.cookieParser());
app.use(app.router);

var routes = require('./routes')(app);

if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}

// Start server
http.createServer(app).listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
    console.log(__dirname);
});

然后我的路线文件如下所示:

// routes.js    
module.exports = function(app) {
        //Routes
        // app.get('/', routes.index);
        app.get('/api/places', places);

        app.get('/add-review', review);
        app.get('/logout', logout);
        app.get('/:location?/:category?', session(app), routes.index);
    }   

我正在尝试加载图片的玉视图

# view
img(src="/nodeapp/img/logo-white.png")

我正在为节点应用程序使用反向代理,其根目录为http://app.com/nodeapp

文件夹结构:

public
   components
   css
   img
   js
server
   srs
      views
      app.js
   test

我得到的错误是:

TypeError: Cannot read property 'logo-white.png' of undefined
    at Object.get_listings (/app/server/src/models/vendors.js:354:16)
    at exports.index (/app/server/src/handlers/index.js:6:31)
    at callbacks (/app/node_modules/express/lib/router/index.js:161:37)
    at /app/server/src/middlewares/session.js:13:5
    at /app/bbe/server/src/api.js:18:3
    at _fulfilled (/app/node_modules/requestify/node_modules/q/q.js:798:54)
    at self.promiseDispatch.done (/app/requestify/node_modules/q/q.js:827:30)
    at Promise.promise.promiseDispatch (/app/node_modules/requestify/node_modules/q/q.js:760:13)
    at /app/node_modules/requestify/node_modules/q/q.js:574:44
    at flush (/app/node_modules/requestify/node_modules/q/q.js:108:17)
GET /img/logo-white.png 500 857ms

所以,在这里,它试图实际渲染我的玉视图,而不是从静态文件夹中提供服务。其他静态文件,如js和css可以很好地服务。为什么会这样?

谢谢!

===编辑(添加渲染视图的功能)===

exports.index = function(req, res) {  
    res.locals.location = data().get_location(req.params);  
    res.locals.categories =  data().get_categories(res.locals.location);  
    res.locals.listings = data().get_listings(res.locals.location, req.params.category);  

    var meta = {  
        title: "My app",  
        module: "/nodeapp/js/core/index/main.js"  
    };  

    res.render('nodeapp/index', meta);  
};

1 个答案:

答案 0 :(得分:0)

设置“视图”路径时我自己也遇到了麻烦,所以也许问题是一样的。

我会尝试为我喜欢的不同网站设​​置不同的视图路径(每个应用)

// site1.js
app.set('views', __dirname + '/views/site1');

// site2.js
app.set('views', __dirname + '/views/site2');

由于某种原因,它只是找不到要渲染的视图。所以,我不得不将它们全部设置回'/ views'目录,当我渲染它们时,我在那里包含了额外的目录,这很有效。

我在想你是否重组了你的目录,所以这个

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

变为

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

它可能会开始为你工作。我假设你的公共目录中的所有其他东西也没有正确处理。如果它只是那个png文件...检查名称,重命名它,摆弄它。