heroku - heroku 上的 Hapi 服务器无法绑定(bind)端口

标签 heroku reactjs port babeljs hapi.js

我正在为 ReactJS 应用程序开发 Hapi 服务器,但当我尝试部署到 Heroku 时,收到 R10 错误“无法在启动后 60 秒内绑定(bind)到 $PORT”。到底是怎么回事?我正在使用 process.env.PORT。我也尝试过 parseInt() 。还尝试禁用不同的软件包。构建始终成功。

在 Heroku 日志中,我看到来自 index.js 的控制台日志(“Hapi running on ...”),但随后出现 R10 错误并且服务器重新启动,然后崩溃。

==> 🌎 Hapi 生产服务器 (API) 正在监听 http://localhost:14316 2016-01-22T15:10:33.947571+00:00 heroku[web.1]:使用 SIGKILL 停止进程 2016-01-22T15:10:33.947571+00:00 heroku[web.1]: 错误 R10 (启动超时) -> Web 进程无法在启动后 60 秒内绑定(bind)到 $PORT 2016-01-22T15:10:34.737554+00:00 heroku[web.1]:状态从开始变为崩溃 2016-01-22T15:10:34.724233+00:00 heroku[web.1]:进程已退出,状态为 137

当我使用 NODE_ENV=product 运行时,这一切都在本地运行良好

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

最佳答案

process.env.HOST 在 Heroku 上未定义,并且由于某种原因它不喜欢 localhost 作为主机,这导致了问题。

我只是将主机变量全部删除,因此连接如下所示:

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

关于heroku - heroku 上的 Hapi 服务器无法绑定(bind)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34950205/

相关文章:

c - 如何获取ip地址的端口?

node.js - 无法使用 Nodemailer 和 Node.js 发送邮件

php - 在 Heroku 上使用 Redactor 进行拼写检查

javascript - React(ES6类)中哪种绑定(bind)上下文的方法更好

javascript - 带有 html 的 Es6 map 数组在 JSX 中不起作用?

reactjs - 如何在 react 中更改 MaterialUI 概述的按钮组边框的颜色?

python - OpenCV Python 链接器错误

heroku - Grunt Shell + Heroku Push = 无标准输出

java - 找不到 COM 端口且端口列表为空

mysql - XAMPP 服务器错误 : MySQL shutdown unexpectedly