从已部署到Heroku的Node应用程序提供公共文件

时间:2015-01-29 22:01:50

标签: node.js heroku express

以前曾经问过,我尝试了各种建议的路径方法,但我还没有弄清楚如何为我的情况做这件事。

我知道使用......

1) app.use(express.static(path.join(process.env.PWD, 'public')));
2) app.use(express.static('./public')));
3) app.use(express.static(path.join(__dirname, 'public')));

在本地,选项1和2可以工作,但是当部署到Heroku时不起作用。选项3在本地不起作用。

我想我已经弄清楚它为什么不起作用,这就是在启动服务器的js文件中没有使用app.use配置(例如server.js)。 app.use配置位于另一个目录中的另一个文件(名为express.js)。

这是我的设置

asmtax
  --app
    --controllers
    --models
    --routes
    --views
  --config
    --express.js
  --public
    --css
    --js
    --images
  --server.js

这是我的express.js文件

process.env.PWD = process.cwd();

var config = require('./config');
var express = require('express');
var morgan = require('morgan');
var compress = require('compression');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var session = require('express-session');
var flash = require('connect-flash');
var passport = require('passport');
var path = require('path');

module.exports = function() {

//initialize express app
var app = express();

if(process.env.NODE_ENV === 'development') {
  app.use(morgan('dev'));
} else if(process.env.NODE_ENV === 'production') {
  app.use(compress());
}

app.use(bodyParser.urlencoded({extended:true}));

app.use(bodyParser.json());
app.use(methodOverride());

app.use(session({
  saveUninitialized: true,
  resave: true,
  secret: config.sessionSecret
}));

app.set('views', './app/views');
app.set('view engine', 'ejs');

require('../app/routes/index.server.routes.js')(app);
require('../app/routes/about.server.routes.js')(app);

app.use(express.static(path.join(process.env.PWD, 'public')));

return app;

};

这是我的server.js文件

process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var port = process.env.PORT || 3000;

var express = require('./config/express');

var app = express();

app.listen(port, function () {
  console.log('listening on port ' + port);
  console.log(require('fs').existsSync(__dirname + '/public'));
});

module.exports = app;

有关如何使其发挥作用的任何建议吗?

3 个答案:

答案 0 :(得分:1)

我不确定是否很重要,但是@sheldonk的答案在他对path.join的使用中仍然带有/。我采用了一些稍有不同的方法,但效果很好,但是它是基于他的答案,因此我为他的答案加了1。

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

path.join支持N个参数,并将它们适当地组合在一起。

答案 1 :(得分:0)

尝试

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

__ dirname是指文件的目录。因为'express.js'在config目录中。你需要提升一个级别才能访问公众。

答案 2 :(得分:0)

对我来说,__ dirname确实有效。我的包含JS的文件夹碰巧在我的布局文件中大写,但不在文件夹结构中。

所以,就像/ public / Bootstrap / js导致了probs。将其重命名为/ public / bootstrap / js,即使使用__dirname也可以正常工作。