Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从';他被派往赫罗库_Node.js_Heroku_Express - Fatal编程技术网

Node.js 从';他被派往赫罗库

Node.js 从';他被派往赫罗库,node.js,heroku,express,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时不起作用。

以前有人问过这个问题,我尝试过各种建议的路径方法,但我还没有弄清楚如何在我的案例中做到这一点

我知道使用

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在本地不起作用

我想我已经找到了它不起作用的原因,那就是app.use配置没有在启动服务器的js文件中使用(例如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;
有什么建议可以让它工作吗?

试试看

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

__dirname指的是文件的目录。因为'express.js'在配置目录中。你需要升一级才能访问public。

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


因此,like/public/Bootstrap/js引起了问题。将其重命名为/public/bootstrap/js,即使使用了_dirname,效果也很好。

我不确定这是否重要,但@sheldonk的答案在他对path.join的使用中隐藏了一个/。我用了一些稍微不同的方法,效果很好,但这是建立在他的答案之上的,所以我给他的答案加1作为灵感

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

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

您可能希望对视图路径执行相同的操作“path.join(\uu dirname,../app/views”);。好的,这现在在本地工作,但在heroku上仍然不起作用。所有公共文件仍将获得404。看来在部署到时无法使用_dirname。看起来您应该使用process.env.PWD。当我使用app.use(express.static(path.join(process.env.PWD,'public'))时,它在本地工作,当我在console.log中记录该路径时,它返回正确的路径。但是,这在heroku上仍然不起作用。对此的答案建议您将npm版本添加到package.json中。此问题建议您可以使用_dirname__dirname与process.env.PWD截然不同