我的node.js和socket.io设置完全在本地计算机上运行,但现在我正在尝试将其传输到我的实时服务器。
我已经安装了node.js和socket.io并且它们正在工作,但我似乎无法通过我的客户端链接到socket.io/socket.io.js文件。它不断回来“500内部服务器错误”
我尝试过使用这两种路径:
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
和
<script type="text/javascript" src="https://localhost:8080/socket.io/socket.io.js"></script>
为什么不找到它?
答案 0 :(得分:0)
“500内部服务器错误”通常表示“服务器崩溃”或至少“服务器遇到异常”。所以问题可能不会缺少socket.io.js。
无论如何,当我在本地工作和远程工作之间存在差异时,有时由于环境变量的不同而导致差异。你在哪里部署node.js? Heroku,EC2,Joyent?
答案 1 :(得分:0)
您是否更改了连接字符串?您是否已使用浏览器检查器检查是否加载了javascript文件?
var sio = io.connect('http://yourdomain.com:80');
sio.socket.on('error', function (reason){
console.error('Unable to connect Socket.IO', reason);
});
答案 2 :(得分:0)
这里我发布了两个文件,一个是chat.js,另一个是chat.html。这在html中有socket.io.js的路径。这可行。
1)chat.js:
var io = require("socket.io");
var socket = io.listen(1223);
socket.set("log level", 1);
var people = {};
socket.on("connection", function (client) {
client.on("join", function(name){
people[client.id] = name;
client.emit("update", "You have connected to the server.");
socket.sockets.emit("update", name + " has joined the server.")
socket.sockets.emit("update-people", people);
});
client.on("send", function(msg){
socket.sockets.emit("chat", people[client.id], msg);
});
client.on("disconnect", function(){
socket.sockets.emit("update", people[client.id] + " has left the server.");
delete people[client.id];
socket.sockets.emit("update-people", people);
});
});
2)chat.html:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://localhost:1223/socket.io/socket.io.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"> </script>
<script>
$(document).ready(function(){
var socket = io.connect("127.0.0.1:1223");
$("#chat").hide();
$("#name").focus();
$("form").submit(function(event){
event.preventDefault();
});
$("#join").click(function(){
var name = $("#name").val();
if (name != "") {
socket.emit("join", name);
$("#login").detach();
$("#chat").show();
$("#msg").focus();
ready = true;
}
});
$("#name").keypress(function(e){
if(e.which == 13) {
var name = $("#name").val();
if (name != "") {
socket.emit("join", name);
ready = true;
$("#login").detach();
$("#chat").show();
$("#msg").focus();
}
}
});
socket.on("update", function(msg) {
if(ready)
$("#msgs").append("<li>" + msg + "</li>");
})
socket.on("update-people", function(people){
if(ready) {
$("#people").empty();
$.each(people, function(clientid, name) {
$('#people').append("<li>" + name + "</li>");
});
}
});
socket.on("chat", function(who, msg){
if(ready) {
$("#msgs").append("<li><strong><span class='text-success'>" + who + "</span></strong> says: " + msg + "</li>");
}
});
socket.on("disconnect", function(){
$("#msgs").append("<li><strong><span class='text-warning'>The server is not available</span></strong></li>");
$("#msg").attr("disabled", "disabled");
$("#send").attr("disabled", "disabled");
});
$("#send").click(function(){
var msg = $("#msg").val();
socket.emit("send", msg);
$("#msg").val("");
});
$("#msg").keypress(function(e){
if(e.which == 13) {
var msg = $("#msg").val();
socket.emit("send", msg);
$("#msg").val("");
}
});
});
</script>
</head>
<body>
<div class="row">
<div class="span2">
<ul id="people" class="unstyled"></ul>
</div>
<div class="span4">
<ul id="msgs" class="unstyled"></ul>
</div>
</div>
<div class="row">
<div class="span5 offset2" id="login">
<form class="form-inline">
<input type="text" class="input-small" placeholder="Your name" id="name">
<input type="button" name="join" id="join" value="Join" class="btn btn-primary">
</form>
</div>
<div class="span5 offset2" id="chat">
<form id="2" class="form-inline">
<input type="text" class="input" placeholder="Your message" id="msg">
<input type="button" name="send" id="send" value="Send" class="btn btn-success">
</form>
</div>
</div>
</body>
</html>
使用命令运行chat.js - node chat.js 并在浏览器中运行chat.html。
答案 3 :(得分:0)
我知道它已经 8 岁了,但我遇到了同样的错误,也许我的解释可以帮助某人。
通过“尝试转移到我的实时服务器”,我确实将它部署到了通过 Apache 的Passenger 模块运行Node 的虚拟共享主机。然后我联系了技术支持,他们说脚本开始监听一些端口和崩溃,这种类型的托管计划根本不可能,我应该申请 VPS/VDS。
这听起来很奇怪,因为应用程序甚至没有开始侦听,它只是访问静态文件。但可能 Express 交付静态文件的方式不起作用。日志说:
[pid 66771] 19:33:18 listen(12, 511) = -1 EPERM(不允许操作) 事件.js:183 扔er; // 未处理的“错误”事件 ^
我能够读到 Express 正在使用“流”(nodejs.org/api/stream.html) 来提供静态文件,我有一个建议,它根本不适用于这种类型的托管。其他静态文件在物理上存在,因此它们与 Nginx 一起交付并且不会失败。这让人有些意外,因为有些文件已加载,有些文件会出现错误 500,甚至在无法定位资源时出现 4xx。
基本上响应 500 告诉我们输出意外结束。日志说“标题前的脚本结束”。当您无法访问任何日志消息而仅收到响应 500 并且必须联系支持人员以查看日志时,这是令人不快的。