2014-11-20 58 views
3

有人知道如何從URL中的node.js服務器文件夾中獲取圖像嗎? 在我的文件夾結構中我有文件夾數據,裏面有子文件夾img與圖像。我想用URL來訪問這個形象,像這樣:如何從URL中的node.js服務器文件夾獲取圖像?

http://localhost:3000/data/img/default.jpg 

但是當我將其輸入到瀏覽器中,我總是得到這個錯誤:

Page Not Found /data/img/default.jpg is not a valid path.

server.js:

'use strict'; 
/** 
* Module dependencies. 
*/ 
var init = require('./config/init')(), 
    config = require('./config/config'), 
    mongoose = require('mongoose'); 
var express = require('express'); 

/** 
* Main application entry file. 
* Please note that the order of loading is important. 
*/ 

// Bootstrap db connection 
var db = mongoose.connect(config.db, function(err) { 
    if (err) { 
     console.error('\x1b[31m', 'Could not connect to MongoDB!'); 
     console.log(err); 
    } 
}); 

// Init the express application 
var app = require('./config/express')(db); 

// Bootstrap passport config 
require('./config/passport')(); 

app.use(express.static('data/img')); 
// Start the app by listening on <port> 
app.listen(config.port); 

// Expose app 
exports = module.exports = app; 

// Logging initialization 
console.log('MEAN.JS application started on port ' + config.port); 

express.js:

'use strict'; 

/** 
* Module dependencies. 
*/ 
var express = require('express'), 
    morgan = require('morgan'), 
    bodyParser = require('body-parser'), 
    session = require('express-session'), 
    compress = require('compression'), 
    methodOverride = require('method-override'), 
    cookieParser = require('cookie-parser'), 
    helmet = require('helmet'), 
    passport = require('passport'), 
    mongoStore = require('connect-mongo')({ 
     session: session 
    }), 
    flash = require('connect-flash'), 
    config = require('./config'), 
    consolidate = require('consolidate'), 
    path = require('path'); 

module.exports = function(db) { 
    // Initialize express app 
    var app = express(); 

    // Globbing model files 
    config.getGlobbedFiles('./app/models/**/*.js').forEach(function(modelPath) { 
     require(path.resolve(modelPath)); 
    }); 

    // Setting application local variables 
    app.locals.title = config.app.title; 
    app.locals.description = config.app.description; 
    app.locals.keywords = config.app.keywords; 
    app.locals.facebookAppId = config.facebook.clientID; 
    app.locals.jsFiles = config.getJavaScriptAssets(); 
    app.locals.cssFiles = config.getCSSAssets(); 

    // Passing the request url to environment locals 
    app.use(function(req, res, next) { 
     res.locals.url = req.protocol + '://' + req.headers.host + req.url; 
     next(); 
    }); 

    // Should be placed before express.static 
    app.use(compress({ 
     filter: function(req, res) { 
      return (/json|text|javascript|css/).test(res.getHeader('Content-Type')); 
     }, 
     level: 9 
    })); 

    // Showing stack errors 
    app.set('showStackError', true); 

    // Set swig as the template engine 
    app.engine('server.view.html', consolidate[config.templateEngine]); 

    // Set views path and view engine 
    app.set('view engine', 'server.view.html'); 
    app.set('views', './app/views'); 

    // Environment dependent middleware 
    if (process.env.NODE_ENV === 'development') { 
     // Enable logger (morgan) 
     app.use(morgan('dev')); 

     // Disable views cache 
     app.set('view cache', false); 
    } else if (process.env.NODE_ENV === 'production') { 
     app.locals.cache = 'memory'; 
    } 

    // Request body parsing middleware should be above methodOverride 
    app.use(bodyParser.urlencoded({ 
     extended: true 
    })); 
    app.use(bodyParser.json()); 
    app.use(methodOverride()); 

    // Enable jsonp 
    app.enable('jsonp callback'); 

    // CookieParser should be above session 
    app.use(cookieParser()); 

    // Express MongoDB session storage 
    app.use(session({ 
     saveUninitialized: true, 
     resave: true, 
     secret: config.sessionSecret, 
     store: new mongoStore({ 
      db: db.connection.db, 
      collection: config.sessionCollection 
     }) 
    })); 

    // use passport session 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

    // connect flash for flash messages 
    app.use(flash()); 

    // Use helmet to secure Express headers 
    app.use(helmet.xframe()); 
    app.use(helmet.xssFilter()); 
    app.use(helmet.nosniff()); 
    app.use(helmet.ienoopen()); 
    app.disable('x-powered-by'); 

    // Setting the app router and static folder 
    app.use(express.static(path.resolve('./public'))); 

    // Globbing routing files 
    config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) { 
     require(path.resolve(routePath))(app); 
    }); 

    // Assume 'not found' in the error msgs is a 404. this is somewhat silly, but valid, you can do whatever you like, set properties, use instanceof etc. 
    app.use(function(err, req, res, next) { 
     // If the error object doesn't exists 
     if (!err) return next(); 

     // Log it 
     console.error(err.stack); 

     // Error page 
     res.status(500).render('500', { 
      error: err.stack 
     }); 
    }); 

    // Assume 404 since no middleware responded 
    app.use(function(req, res) { 
     res.status(404).render('404', { 
      url: req.originalUrl, 
      error: 'Not Found' 
     }); 
    }); 

    return app; 
}; 
+0

請發佈您的服務器代碼。有幾種方法可以做到這一點。記住,節點不是apache。你想要做的任何事情都必須啓用。您可能只是缺少訪問文件的配置。 – 2014-11-20 18:06:05

+0

實際上它是由YO平均值生成器生成的。我發現了這樣一些解決方案:var express = require('express'); var app = express.createServer(); (express.static(__ dirname +'/ public')); app.listen(8080);但我對node.js非常陌生,不知道如何將它應用到我的應用程序中,並且每一個幫助都非常有趣。 – mark 2014-11-20 19:29:49

+0

express.static正是我想說的。您可以將它放在現有的app.use()語句中。我總是把這些東西放在'app.configure();'但我不認爲這是必要的。 – 2014-11-20 19:46:57

回答

4

這就像你h AVE已經設定了數據/ IMG文件夾,如下行靜態文件夾:

app.use(express.static('data/img')); 

在這種情況下,你應該訪問上面用下面的網址放在靜態文件夾的圖像:

http://localhost:3000/default.jpg 

不過,我會建議你使用Node的全局變量__dirname來表示靜態文件夾的根目錄,但這取決於你的server.js在你的文件結構中的位置。

包含以下代碼片段的js文件位於根目錄中,並且我還有根目錄中的/ data/img文件夾,並且我可以使用/ image名稱檢索圖像。

var express = require('express'); 
var app = express(); 
app.use(express.static(__dirname + '/data/img')); 
app.listen(3500, function() { 
    console.log('Express server is listening, use this url - localhost:3500/default.png'); 
}); 

看看這是否對您有所幫助。如果確實如此,請確保知道使用__dirname全局變量名稱的原因。

SO1

+0

它有幫助。謝謝 – mark 2014-11-26 11:08:07