我正在尝试制作一个简单的聊天应用程序。它在本地主机上正常工作:3000/chat.html,但是当它被部署在OpenShift,它崩溃,出现以下错误:(我rhc tail
日志后)events.js:72扔呃; //未处理'错误'事件^错误:在OpenShift上侦听EACCES
编辑:我不明白这个错误更多
events.js:72
throw er; // Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:905:11)
at Server._listen2 (net.js:1024:19)
at listen (net.js:1065:10)
at net.js:1147:9
at dns.js:72:18
at process._tickCallback (node.js:442:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:929:3
DEBUG: Program node server.js exited with code 8
DEBUG: Starting child process with 'node server.js'
我看了一下这个错误,它并没有解决我的问题类似的帖子。 1)我绑定在高port (3000)
2)我的地址是不使用(否则,我会得到EADDRRINUSE
)3)我有OpenShift另一个应用程序正在收听port 3000
,但我认为他们不应该影响对方因为域是不同
这里是我的package.json:
{
"name": "chat",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.15.1",
"cookie-parser": "^1.4.3",
"express": "^4.13.4",
"express-session": "^1.14.2",
"multer": "^1.1.0",
"sockjs": "^0.3.18"
}
}
这里是我的server.js:
var express = require('express');
var app = express();
var session = require('express-session');
var http = require('http');
var sockjs = require('sockjs');
var connections = [];
var chat = sockjs.createServer();
chat.on('connection', function(conn) {
connections.push(conn);
var number = connections.length;
conn.write("Welcome, User " + number);
conn.on('data', function(message) {
for (var ii=0; ii < connections.length; ii++) {
connections[ii].write("User " + number + " says: " + message);
}
});
conn.on('close', function() {
for (var ii=0; ii < connections.length; ii++) {
connections[ii].write("User " + number + " has disconnected");
}
});
});
var server = http.createServer();
chat.installHandlers(server, {prefix:'/chat'});
server.listen(9999, '127.0.0.1');
app.use(express.static(__dirname + '/public'));
var ipaddress = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
var port = process.env.OPENSHIFT_NODEJS_PORT || 3000;
app.listen(port, ipaddress, function() {
console.log("Listening on " + ipaddress + ", port " + port)
});
我有固定下来在这部分server.js
的错误,如果我评论它,聊天显然不会工作,但我可以部署它在OpenShift。我是否在创建socket
或HTTP
服务器错误OpenShift?
var connections = [];
var chat = sockjs.createServer();
chat.on('connection', function(conn) {
connections.push(conn);
var number = connections.length;
conn.write("Welcome, User " + number);
conn.on('data', function(message) {
for (var ii=0; ii < connections.length; ii++) {
connections[ii].write("User " + number + " says: " + message);
}
});
conn.on('close', function() {
for (var ii=0; ii < connections.length; ii++) {
connections[ii].write("User " + number + " has disconnected");
}
});
});
var server = http.createServer();
chat.installHandlers(server, {prefix:'/chat'});
server.listen(9999, '127.0.0.1');
编辑: 相反的:
var server = http.createServer();
chat.installHandlers(server, {prefix:'/chat'});
server.listen(9999, '127.0.0.1');
尝试这样做,也没有对OpenShift工作,也能正常工作的本地主机:3000/chat.html
app.set('port', 9999);
var server = http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
chat.installHandlers(server, {prefix:'/chat'});
编辑: 我把这个线后一路在顶部
var ipaddress = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
相反的:
var server = http.createServer();
chat.installHandlers(server, {prefix:'/chat'});
server.listen(9999, '127.0.0.1');
我:
var server = http.createServer(app).listen(app.get('port'), ipaddress, function(){
console.log('Express server listening on port ' + app.get('port') + ', ip: ' + ipaddress);
});
chat.installHandlers(server, {prefix:'/chat'});
现在,不会再崩溃,但http服务器不在监听。
调试信息:
1)本地主机:
Http server listening on port 9999, ip: 127.0.0.1
Express server listening on 127.0.0.1, port 3000
OpenShit:
Http server listening on port 9999, ip: 127.5.69.129
Express server listening on 127.5.69.129, port 8080
2)刚刚发现的是,当我运行应用程序在本地,然后我的两个localhost
和OpenShift在我的机器上本地工作。如果我使用我的手机获取相同的OpenShift链接,http
服务器不在监听,所以我无法聊天。
我手动将chat.html中的127.0.0.1替换为127.5.69.129(Openshift IP),但它仍然无法工作。端口9999上的套接字连接未建立,因为如果它已建立,它将显示“Welcome,User 1”(来自server.js)。什么都不显示,也许不仅仅是IP和端口?我在GIthub也更新了我的代码 – HoKy22
也许它确实与端口号有关? https://developers.openshift.com/managing-your-applications/port-binding-routing.html或OpenShift不允许两个端口? – HoKy22
@ HoKy22当然,当你使用IP替换127.0.0.1时,它不起作用 - 这是分配给你的设备的随机内部OpenShift IP。您需要:1.使用公共主机名和端口80或443从客户端访问您的应用程序; 2.确保这是http流量* only *; 3.确保OpenShift代理知道什么内部服务重定向该流量(即决定端口9999或3000,但不是两者) –