2017-07-20 8 views
1

私はherokuに配備しているNode/Postgresアプリケーションをビルドしています。プロダクションでアプリを開くときにタイムアウトエラーが発生しました。 Heroku氏によると、私が受け取っているエラーは、データベースやポートの接続に関する問題です。データベースの接続は問題ないと思いますが、接続が成功したというログが表示されています。 Postgresとの統合がPORT接続の問題を引き起こしたかどうかは不明です。ここでノード/ Sequelizeアプリケーションをherokuにデプロイ - PORTの問題

は、Herokuのログにエラー(非常に有用ではない)

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 

// //が設定

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); 
} 

をapp.jsです/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" 
    } 
} 

上記のアスタリスクのすべて同じ機密情報を含む

//モデル/ 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; 

ありがとう!

****配備時にpostgresへの接続が成功した追加のログ。私はこれがアプリケーションを開こうとしている間ではないことに注意したい、私は何かをアプリケーションのオープン時にポストグアにサーバーを受信して​​いない。

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

私は、これはポートの問題であると考えています。私はjsファイルにいくつかのログを配置し、すべてがモデル/インデックスに円滑に記録されますが、現在私のwwwファイルにログを記録しています。私はそこに問題があると信じています。

答えて

0

私の問題は、実際には続編やアプリの設定とは関係ありませんでした。私のpackage.jsonファイルは、npm startにbin/wwwwの代わりにapp.jsを使用していました。したがって、app.jsとmodels/indexが呼び出されましたが、bin/wwwの実際のサーバーは呼び出されませんでした。 herokuログの即時クラッシュでこの問題を解決しようとする人は、私の提案です。いくつかのconsole.log()をアプリケーションサーバーまたはアプリケーションファイルに配置し、何が呼び出されるかを確認します。呼び出しが停止すると、それが問題の原因になります。

関連する問題