2016-01-22 5 views
5

Ich arbeite an einem Hapi-Server für eine ReactJS-App, aber wenn ich versuche, auf Heroku zu implementieren, bekomme ich den R10-Fehler "Fehler beim Binden an $ PORT innerhalb von 60 Sekunden nach dem Start" . Was ist los? Ich benutze process.env.PORT. Ich habe auch parseInt() um es herum versucht. Außerdem wurde versucht, unterschiedliche Pakete zu deaktivieren. Der Build ist immer erfolgreich.Hapi-Server auf Heroku kann Port nicht binden

In den Heroku-Protokollen sehe ich das Konsolenprotokoll von der index.js ("Hapi läuft auf ..."), aber dann erscheint der R10-Fehler und der Server startet neu und stürzt ab.

==> Hapi Production Server (API) hört auf http://localhost:14316 2016-01-22T15: 10: 33,947571 + 00: 00 Heroku [web.1]: mit Prozess Stoppen SIGKILL 2016-01-22T15: 10 : 33.947571 + 00: 00 heroku [web.1]: Fehler R10 (Zeitüberschreitung bei dem Systemstart) -> Der Webprozess konnte nicht innerhalb von 60 Sekunden nach dem Start an $ PORT gebunden werden 2016-01-22T15: 10: 34.77554 + 00: 00 heroku [ web.1]: Status vom Start zum Absturz geändert 2016-01-22T15: 10: 34.724233 + 00: 00 heroku [web.1]: Prozess beendet mit Status 137

Das läuft alles gut lokal wenn ich mit laufe NODE_ENV = Produktion

src/server.js

import Hapi from 'hapi'; 
import Inert from 'inert'; 
import jwt from 'hapi-auth-jwt2'; 
import React from 'react'; 
import { renderToString } from 'react-dom/server'; 
import { RoutingContext, match } from 'react-router'; 
import { Provider } from 'react-redux'; 
import createRoutes from './routes'; 
import configureStore from './store/configureStore'; 
import Html from './Html'; 

const PROTOCOL = 'http://'; 
const SERVER_HOST = process.env.HOST || 'localhost'; 
const SERVER_PORT = process.env.PORT || 3000; 
const API_HOST = process.env.API_HOST || 'localhost'; 
const API_PORT = process.env.API_PORT || 8000; 

export default function(callback) { 

    const server = new Hapi.Server(); 

    server.connection({ 
    host: SERVER_HOST, 
    port: SERVER_PORT, 
    labels: ['api'], 
    // routes: { 
    // cors: { 
    //  origin: [PROTOCOL + API_HOST + ':' + API_PORT] 
    // } 
    // } 
    }); 

    server.connections[0].name = 'API'; 

    server.register([ 
     { register: Inert }, 
     { register: jwt }, 
     // { 
     // register: api, 
     // routes: { 
     //  prefix: '/api' 
     // } 
     // } 
    ], (err) => { 
    if(err) { 
     console.error('ERROR:', err) 
     throw err; 
    } 

     server.route({ 
     method: 'GET', 
     path: '/{param*}', 
     handler: { 
      directory: { 
      path: 'static' 
      } 
     } 
     }); 

     server.ext('onPreResponse', (request, reply) => { 

      if (typeof request.response.statusCode !== 'undefined') { 
     return reply.continue(); 
     } 

      const assets = { 
       javascript: { 
        main: '/dist/bundle.js' 
       } 
      }; 

      const store = configureStore(); 
      const routes = createRoutes(store); 

      // this gets called if server side rendering/routing has problems and errors 
      function hydrateOnClient() { 
      reply('<!doctype html>\n' + 
       renderToString(<Html assets={assets} store={store} />)).code(500); 
      } 

      match({ routes, location: request.path }, (error, redirectLocation, renderProps) => { 

      if (redirectLocation) { 

       res.redirect(301, redirectLocation.pathname + redirectLocation.search) 

      } else if (error) { 
       console.error('ROUTER ERROR:', error) // eslint-disable-line no-console 
       hydrateOnClient(); 

      } else if (!renderProps) { 

       // in some cases this would act as a 404 but that should be handled in the routes 
       hydrateOnClient(); 

      } else { 

       const component = (
       <Provider store={store}> 
        <RoutingContext {...renderProps} /> 
       </Provider> 
      ); 

       reply('<!doctype html>\n' + 
       renderToString(<Html assets={assets} component={component} store={store} />) 
        ); 
      } 
      }); 
     }); 
    }); 

    return server.start((err) => { 

     if(err) { 
      console.log(err); 
      throw err; 
     } 

     callback(server) 
    }); 

} 

index.js

require('babel-core/register'); 

global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production'; 
global.__SERVER__ = true; 
global.__CLIENT__ = false; 

const server = require('./src/server'); 

server(server => { 
    for (var key of Object.keys(server.connections)) { 
    console.info('==> Hapi Production Server (' + server.connections[key].name + ') is listening on', server.connections[key].info.uri); 
    } 
}); 

Antwort

8

process.env.HOST wurde auf Heroku undefiniert, und aus irgendeinem Grund hat es nicht localhost als Wirt mögen, die das Problem verursacht.

Ich habe einfach den Host var alle zusammen, so Zusammenhang wie folgt aussieht:

server.connection({ 
    port: process.env.PORT || 3000, 
    labels: ['api'], 
}) 
+1

es Ihnen danken! Das fing an, mich verrückt zu machen, weil ich das process.env.PORT gut eingerichtet hatte. es war in der Tat, dass Heroku nicht mochte 'server.connection ({port: PORT, host: 'localhost'});' Entfernen der 'Host' param vollständig, wie Sie vorgeschlagen, funktionierte. als solche: 'server.connection ({port: PORT});' prost! – Dominick

+0

Ich hatte das gleiche Problem und habe es auch gelöst, indem ich die Eigenschaft 'host' nicht definiert habe – Pier

Verwandte Themen