如何使用节点和hapi在同一端口上运行多个服务器标签?

我试图在同一个节点代码堆栈上托pipeapi和web服务器。 我已经使用标签为了独立应用configuration到每台服务器,但只有一台服务器的作品。 以下是代码:

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路线工作。

正如评论者所提到的,您不能在同一个networking接口上创build2个到同一个端口的连接。 如果两个套接字尝试在相同的端口上侦听,则会一直返回到侦听系统调用,从而导致EADDRINUSE错误。

在不同的端口或单独的networking接口上创build两个连接是完全可以的:

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

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

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

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

希望有所帮助!