【问题标题】:Heroku local serves only nodeJS and no angular and no connection to databaseHeroku local 仅服务于 nodeJS,没有角度,也没有与数据库的连接
【发布时间】:2022-01-10 18:20:22
【问题描述】:

我似乎有两个不同的问题。我的应用程序在本地运行,但不在 heroku 上。如果我尝试运行“heroku local”,它会在 localhost:5000 上打开 nodeJS 应用程序并连接到本地数据库。如果我尝试在 heroku 上部署它,它会根据构建日志构建并安装所有内容,但不会运行任何内容。日志显示生产连接字符串(Heroku postgres),但出现错误:ECONNREFUSED 127.0.0.1:5432。对于角度,我认为我提供的静态页面是错误的,但我无法弄清楚。感谢您的帮助。

app.js

var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
require('./controllers/db')

var indexRouter = require('./routes/index');
var covidRouter = require('./routes/covid');
var trafficRouter = require('./routes/traffic');
var mobilityRouter = require('./routes/mobility');

var app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public', 'build')));
console.log(__dirname)

app.use('/', (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    res.header('Access-Control-Expose-Headers', 'X-Total-Count');
    res.header('Access-Control-Allow-Methods', 'DELETE, POST, PUT, GET');
    next();
});

app.use('/', indexRouter);
app.use('/covid', covidRouter);
app.use('/traffic', trafficRouter);
app.use('/mobility', mobilityRouter);


// const distFolder = isProduction?:'build';
app.use("/*",function(req,res){
    res.sendFile(path.join(__dirname,'..','public','dist', 'index.html'));
});


// Obvladovanje napak zaradi avtentikacije
app.use((err, req, res, next) => {
    if (err.name == "UnauthorizedError") {
        res.status(401).json({"sporocilo": err.name + ": " + err.message});
    }
});
// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});


app.use(function(req, res, next) {
    next(createError(404));
});

module.exports = app;

db.js

const connectionString = 'postgresql://postgres:postgres@127.0.0.1:5432/postgres';
const connectionStringProd = 'dbConnectionStringHidden'
//(database = "postgres", user='postgres', password='postgres', host='127.0.0.1', port= '5432')

let isProduction = (process.env.NODE_ENV === 'production');
const pool = isProduction ? new Pool({connectionStringProd}) : new Pool({connectionString})


if (isProduction) {
  console.log("Prod")
  console.log(pool)
} else {
  console.log("Dev")
  console.log(pool)
}

async function query(query, params) {
    const {rows, fields} = await pool.query(query, params);

    return rows;
}

module.exports = {
  query
}

Heroku 日志

【问题讨论】:

  • 您需要在 Web 服务器上安装并运行数据库才能使其正常工作。我想在松散耦合的云场景中,您的数据库将完全位于不同的主机上,而不是 127.0.0.1
  • 我在 heroku 上运行了 postgres 基础,我可以通过 pgAdmin 访问它。我还将它设置为 db.js 中的 connectionStringProd,当我将其部署到 heroku 时会显示它

标签: node.js angular postgresql express heroku


【解决方案1】:

问题 1:与 Postgres 的连接失败

-- 你已经设置了一个代码来检查let isProduction = (process.env.NODE_ENV === 'production');。您是否已将此环境属性添加到 Heroku?如果 Heroku 尝试连接到 127.0.0.1:5432,那么您的 env 变量没有设置,否则它应该连接到您在 dbConnectionStringHidden 中指定的生产数据库 url。如果你没有,最好买一个,因为 Heroku 的 127.0.0.1 没有数据库

问题 2:服务 Angular 的静态文件

当您尝试按照app.use(express.static(path.join(__dirname, 'public', 'build'))); 中的指定从public/build 提供静态文件时,您应该确保您的角度构建文件存在于此文件夹中。为此,您可以将构建的文件复制粘贴到那里,或者将 angular.json 中的 buildDir 更新到该文件夹​​。

【讨论】:

  • 是的,我设置了生产字符串。我添加了 heroku 日志的图片,它也被打印了。它已设置但它的行为就像它想要访问本地的一样
  • 我也把它改成了 ``` app.use(express.static(path.join(__dirname, 'public', 'dist', 'public'))); ``` 但还是不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2014-01-21
  • 2013-07-30
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多