2014-11-20 63 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

相关问题