Node.js 如何使用node和hapi在同一端口上运行多个服务器标签?
我正在尝试将api和web服务器托管在同一个节点代码堆栈上。我使用标签将配置独立应用于每台服务器,但只有一台服务器可以工作。代码如下:Node.js 如何使用node和hapi在同一端口上运行多个服务器标签?,node.js,hapijs,Node.js,Hapijs,我正在尝试将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:
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路由工作。正如评论员所提到的,您不能在同一网络接口上创建两个到同一端口的连接。如果两个套接字尝试在同一端口上侦听,则返回给EADDRINUSE错误 在单独的端口或单独的网络接口上创建两个连接完全可以:
server.connection({
host: '127.0.0.1',
port: 4000,
labels: ['api']
});
server.connection({
host: '127.0.0.1',
port: 4001,
labels: ['web']
});
正如Matt已经说过的,不能在同一端口上运行不同的连接。确保应用不同的端口,如
server.connection({
host: 'localhost',
port: process.env.PORT || port
});
server.connection({
host: 'localhost',
port: process.env.PORT + 1 || port + 1
});
如果您想了解更多有关在同一hapi项目中运行API和web服务器的信息,可以浏览以下教程:
希望有帮助 在我看来,您正在尝试在同一端口上运行API和web服务器。这会导致端口冲突。尝试更改端口?不能在同一端口上启动两台服务器。只需为每个设置一个不同的,它就可以正常工作。那么服务器呢?在两个不同的端口上运行em?