【问题标题】:How to run multiple server labels on same port using node and hapi?如何使用节点和 hapi 在同一端口上运行多个服务器标签?
【发布时间】:2015-10-12 16:32:37
【问题描述】:

我正在尝试将 api 和 web 服务器托管在同一节点代码堆栈上。我使用标签来独立地将配置应用于每台服务器,但只有一台服务器可以工作。下面是代码:

var hapi = require('hapi');

// server definition
var server = new hapi.Server();
var runningPort = process.env.PORT || 3000;

// setting up connection
server.connection({
    host: '0.0.0.0',
    port: runningPort,
    labels: ['api']
});

server.connection({
    host: '0.0.0.0',
    port: runningPort,
    labels: ['web']
});



var webServer = server.select('web');
var apiServer = server.select('api');

// registering view engine
webServer.views({
    engines: { html: require('handlebars') },
    relativeTo: __dirname,
    path: './views',
    layoutPath: './views/layout',
    layout: 'default',
    partialsPath: './views/partials'
});

// registering hapi auth cookie and application authentication
webServer.register(
  {
    register: require('hapi-auth-cookie')
  }, 
  function (err) {
    if (err) {
      throw err;
    }

    var cache = webServer.cache({ segment: 'sessions', expiresIn: 3 * 24 * 60 * 60 * 1000 });
    webServer.app.cache = cache;

    webServer.auth.strategy('session', 'cookie', true, {
        password: 'secret',
        cookie: 'sid-example',
        redirectTo: '/account/login',
        isSecure: false
    });
});

// registrations for api server
apiServer.register(
        {
            register: require('lout')
        },
    function (err) {
        if (err) {
            throw err;
        }
});

apiServer.register(require('hapi-auth-bearer-token'), function (err) {

    apiServer.auth.strategy('simple', 'bearer-access-token', {
        allowQueryToken: true,              // optional, true by default
        allowMultipleHeaders: false,        // optional, false by default
        accessTokenName: 'access_token',    // optional, 'access_token' by default
        validateFunc: function( token, callback ) {

            // For convenience, the request object can be accessed
            // from `this` within validateFunc.
            var request = this;

            // Use a real strategy here,
            // comparing with a token from your database for example
            if(token === "1234"){
                //## user object to be looked up here
                callback(null, true, { token: token })
            } else {
                callback(null, false, { token: token })
            }
        }
    });
});

//To do something to request before they passed on to routes
apiServer.ext('onRequest', function (request, reply) {
    //## we can get user object here off of the authToken
    utils.log('info', 'apiCall', {method: request.method, path: request.path})
    return reply.continue();
});

// register routes
webServer.route(webRoutes);
apiServer.route(apiRoutes);

server.start(function () {
    console.log('Web servers running at: ', 'localhost:' + runningPort);
    console.log('Api server running at: ', 'localhost:' + runningPort);
});

目前只有 api 路由有效。

【问题讨论】:

  • 在我看来,您正试图在同一个端口上运行 API 和 Web 服务器。这会让你发生端口冲突。换个端口试试?
  • 你不能在同一个端口上启动两台服务器。只需为每个设置一个不同的,它就可以正常工作。
  • 那么服务器呢?在 2 个不同的端口上运行 em?

标签: node.js hapijs


【解决方案1】:

正如评论者所说,您不能在同一个网络接口上创建两个到同一个端口的连接。如果两个套接字尝试在同一个端口上侦听,这将一直追溯到listen syscall 给出 EADDRINUSE 错误。

在单独的端口或单独的网络接口上创建两个连接是完全可以的:

server.connection({
    host: '127.0.0.1',
    port: 4000,
    labels: ['api']
});

server.connection({
    host: '127.0.0.1',
    port: 4001,
    labels: ['web']
});

【讨论】:

    【解决方案2】:

    正如马特已经说过的,你不能在同一个端口上运行不同的连接。确保应用不同的端口,例如

    server.connection({  
        host: 'localhost',
        port: process.env.PORT || port
    });
    
    server.connection({  
        host: 'localhost',
        port: process.env.PORT + 1 || port + 1
    });
    

    如果您想了解更多关于在同一个 hapi 项目中运行 API 和 Web 服务器的信息,您可以浏览这些教程:

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2017-11-04
      • 2018-02-10
      • 2014-12-26
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多