ExpressでsocketIOを使用しています。
私のプロジェクトには、ログインページとホームページがあります。ログインに成功すると、localhost:3000/homeに移動し、このエラーが表示されます:
GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (Not Found)
App.js(expressによって作成されたプロジェクト)には変更を加えませんでした。
Index.js:
var express = require('express');
var router = express.Router();
var http = require('http');
var fs = require('fs');
var io = require('socket.io')(http);
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.get('/home', function(req, res) {
res.render('home', { title: 'Express' });
});
io.on('connection', function(socket){
console.log("User Connected");
socket.on('chat message', function(msg){
io.emit('chat message', msg);
console.log("Message");
});
socket.on('disconnect', function(msg){
console.log("User DisConnected");
});
});
router.post('/authenticate', function(req, res) {
fs.readFile("./public/Verification/Users.json", "utf8", function (err, data) {
if (err)
console.log(err);
else{
var result = JSON.parse(data);
for(var i=0;i<result.Users.length;i++){
if(req.body.username == result.Users[i].username && req.body.password == result.Users[i].password){
console.log("Success!!!!!!!!!!!!!!");
res.location("home");
res.redirect("home");
}
}
}
});
});
module.exports = router;
Localhost:3000/homeに移動するたびにこのエラーが発生します。 socketIOとexpressの両方が初めてです。何か足りない場合は教えてください。
ありがとう
編集:
私のlayout.jadeでは、次のようにsocketioを定義しました。
script(src='https://cdn.socket.io/socket.io-1.2.0.js')
Express 4を実行している場合、コード行が欠落しているように見えます。
var app = express();
var server = app.listen(3000);
これにより、Webサーバーが起動し、ポート3000に設定されます。ボーンシンプルなExpress 4アプリはこちらをご覧ください。 http://expressjs.com/4x/api.html
そして、socket.ioを起動するには、次を追加します:
var io = require('socket.io').listen(server);
そして、この行は必要ありません:
var http = require('http');
過去5時間この問題と戦っていたので。そして、これはグーグルの最初の結果です。
もちろん2015年と一部のコードが変更されました。
現在、index.jsコードの最良の開始点は次のとおりです。
var express = require('express'),
http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(3000);
順序は非常に重要です。
私の問題は、すべてが適切にインストールされ、ノードがリッスンしていることでした。ただし、example.com/socket.io/socket.io.jsおよびexample.com/socket.io/?eio = ...は404が見つかりませんでした。ただし、example.com:3000/socket.io/socket.io.jsを試したところ、すべてが機能しました。そこで、getJSONクエリをポート部分を持つように変更する方法についての質問がありました。
そのため、解決策はmain.jsを編集することでした。main.jsはチャットのあるindex.htmlに追加されます。がある:
var socket = io();
に置き換えられる
var socket = io.connect('http://example.com:3080');
これにより、getJSONクエリのURLが修正され、正しいポートが追加され、404が不要になります。将来の誰かに役立つことを願っています。
これは私がサーバー側で解決する方法です(2018):
const app = express();
const socketIO = require('socket.io');
const server = express()
.use(app)
.listen(PORT, () => console.log(`Listening Socket on ${ PORT }`));
const io = socketIO(server);
クライアント側
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js"></script>
簡単に見えますが、上記の解決策が役に立たなかったため、解決策を見つけるまでに何時間も費やしました。
設定をこれに変更してください
var express = require('express');
// App setup
var app = express();
var socket = require('socket.io')
var server = app.listen(4000, function(){
console.log('listening for requests on port 4000,');
});
let io = socket(server)
io.on('connection', function(socket){
console.log(`${socket.id} is connected`);
});
Node.jsにプロキシするnginxでこれを行う人にとって、問題はnode.jsコードではなくnginx confである可能性があります。
GETリクエスト(curl、Postman、またはブラウザを使用)で http://localhost/socket.io/ (末尾のスラッシュを使用)にテストし、1つを http:/ /localhost:3000/socket.io/
http://localhost/socket.io/ が404 not foundまたは "Cannot GET /"を与えるが、 http:// localhost:3000/socket.io / が返される場合次のような応答:
{"code":0,"message":"Transport unknown"}
その後、バックエンドのnode.jsとsocket.ioは機能しますが、nginxはリクエストを正しく渡していません。
次のようになっていることを確認します。
location /socket.io/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $Host;
proxy_pass http://127.0.0.1:3000;
}
特に、元のリクエストURIをそのまま渡したい(つまり/socket.ioを含む)ため、proxy_pass http://127.0.0.1:3000
の末尾にスラッシュがないことに注意してください。
Proxy_passディレクティブがURIで指定されている場合、リクエストがサーバーに渡されると、場所に一致する正規化されたリクエストURIの一部がディレクティブで指定されたURIに置き換えられます。
location /name/ { proxy_pass http://127.0.0.1/remote/; }
Proxy_passがURIなしで指定されている場合、要求URIは、元の要求が処理されるときにクライアントによって送信されるのと同じ形式でサーバーに渡されます。または、変更されたURIを処理するときに完全な正規化された要求URIが渡されます:
location /some/path/ { proxy_pass http://127.0.0.1; }
ヘッダーの要件は https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/ でカバーされています(本質的にwebsocketにはHTTP/1.1を必要とするUpgradeヘッダーが必要です)
サーバーのリッスンを呼び出し、コールバックでサーバーインスタンスをモジュールに渡しました。
エクスプレスアプリのbin/www
ファイルの一部
var server = http.createServer(app);
server.listen(port, function () {
console.log('app listening on *:' + port);
require('../socket')(server);
console.log('socket server will be on *:' + port);
});
server.on('error', onError);
server.on('listening', onListening);
これが私のソケットモジュールsocket.js
var io = {};
module.exports = (server, serveradmin) => {
io = require('socket.io')(server);
io.on('connection', function (socket) {
console.log(socket + ' a user connected');
});
}
すべてのソケットリスナーとここからの管理を発行します。