node.js - 从部署到 Heroku 的 Node 应用程序提供公共(public)文件

标签 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 文件(例如 server.js)中没有使用 app.use 配置。 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;

关于如何让它工作有什么建议吗?

最佳答案

尝试

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

__dirname 指的是文件的目录。因为“express.js”在配置目录中。您需要上一级才能访问公共(public)。

关于node.js - 从部署到 Heroku 的 Node 应用程序提供公共(public)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28225470/

相关文章:

node.js - 使用 Mongoose 重复​​项目

javascript - 调试 Protractor

javascript - 在浏览器中运行开发服务器 [如 stackblitz/codesandbox]

multithreading - nodejs - 我发现多线程或使用多个进程比单个进程慢。为什么?

angularjs - Node http 服务器不提供更新的 html 文件

node.js - 在 Node.js 项目中存储通用身份验证详细信息的可靠方法是什么?

mysql - 如何将Mysql的.sql转换为postgresql

Java Play 2 - 编译错误 -> Heroku

ssl - 为什么 Heroku 上的自定义域 SSL 每月要花费 20 美元?

mysql - NodeJS 到 Postman 结果