Ich erstelle eine Node/Postgres-App, die ich auf Heroku deploye. Ich erhalte einen Timeout-Fehler beim Versuch, die App in der Produktion zu öffnen. Laut Heroku stammt der Fehler, den ich erhalte, aus Datenbank- oder Port-Verbindungsproblemen. Ich glaube, dass meine Datenbankverbindung in Ordnung ist, ich bekomme ein Protokoll, dass die Verbindung erfolgreich war. Unsicher, ob meine Integration mit Postgres ein PORT-Verbindungsproblem verursacht hat. HierNode/Sequelize-App in heroku implementieren - Problem mit PORT
ist der Fehler auf Heroku Protokolle (nicht sehr hilfreich)
2017-07-20T17:44:53.432603+00:00 heroku[web.1]: State changed from starting to crashed
2017-07-20T17:44:53.314516+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2017-07-20T17:44:53.314641+00:00 heroku[web.1]: Stopping process with SIGKILL
// app.js
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const bodyParser = require("body-parser");
const logger = require('morgan');
const pg= require('pg');
const index = require('./server/routes/index');
const users = require('./server/routes/users');
const rideRequests = require('./server/routes/riderequests');
const driveRequests = require('./server/routes/driverequests');
const notifications = require('./server/routes/notifications');
const trips = require('./server/routes/trips');
const email = require('./server/routes/mail');
const app = express();
pg.defaults.ssl = true;
pg.connect(process.env.DATABASE_URL, function(err, client) {
if (err) throw err;
console.log('Connected to postgres! Getting schemas...');
client
.query('SELECT table_schema,table_name FROM information_schema.tables;')
.on('row', function(row) {
console.log(JSON.stringify(row));
});
});
app.set('views', path.join(__dirname, './dist'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, './dist')));
app.use(function (req,res,next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers','Origin, X-Requested-With, Content-Type, Accept');
res.header('Access-Control-Allow-Methods', 'POST, PUT, GET, PATCH, DELETE, OPTIONS');
next();
});
app.use('/email', email);
app.use('/trip', trips);
app.use('/notifications', notifications);
app.use('/users', users);
app.use('/ride-request', rideRequests);
app.use('/drive-request', driveRequests);
app.use('/', index);
app.use('*', index);
module.exports = app;
// bin/www
#!/usr/bin/env node
var app = require('../app');
var debug = require('debug')('atlas:server');
var http = require('http');
var models = require('../server/models');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
var server = http.createServer(app);
models.sequelize.sync().then(function() {
server.listen(port, function() {
debug('Express server listening on port ' + server.address().port);
});
server.on('error', onError);
server.on('listening', onListening);
});
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
// Config /config.json
{
"development": {
"username": "****",
"password": "****",
"database": "*_development",
"host": "127.0.0.1",
"dialect": "postgres"
},
"test": {
"username": "****",
"password": "****",
"database": "*_test",
"host": "127.0.0.1",
"dialect": "postgres"
},
"production": {
"use_env_variable": "DATABASE_URL",
"username": "****",
"password": "****",
"database": "*_test",
"host": "*-*.herokuapp.com",
"dialect": "postgres"
}
}
All die Sterne oben enthalten die gleichen sensiblen Informationen
// Modelle/index.js
'use strict';
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
var env = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/config.json')[env];
var db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(function(file) {
var model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(function(modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
Dank!
**** Zusätzliche Protokolle mit erfolgreicher Verbindung zu Postgres bei der Bereitstellung. Ich möchte darauf hinweisen, dass es nicht beim Versuch, die App zu öffnen, ich bekomme nichts vom Server auf Postgres auf App geöffnet.
2017-07-20T18:36:16.953360+00:00 app[web.1]: (node:17) DeprecationWarning: PG.connect is deprecated - please see the upgrade guide at https://node-postgres.com/guides/upgrading
2017-07-20T18:36:16.991855+00:00 app[web.1]: Connected to postgres! Getting schemas...
***** UPDATE
Ich glaube, das ein Port Problem. Ich habe ein paar Logs in die js-Dateien geschrieben und alles protokolliert reibungslos in models/index, aber ich erhalte jetzt meine www-Datei. Ich glaube, da liegt das Problem.