JavaScriptオブジェクトの動作を混乱させます
-
27-10-2019 - |
質問
socket.ioを使用してnode.jsを使用しています。
オブジェクトがあります socket
これは次のようになります:
SocketNamespace
$events: Object
...
socket: Socket
だから私が見たら Socket
(すなわち socket.socket
)
Socket
$events: Object
...
sessionid: "1549988601982716407"
繰り返しますが、正常に機能します。
しかし、私がただ戻りたいなら sessionid
, 、だから私は使用します socket.socket.sessionid
わかります...
undefined
私がする場合 typeof
為に socket.socket
私は得ます object
, 、しかし socket.socket.sessionid
, 、私はちょうどわかります undefined
.
編集: これが私のコードです:
ブラウザ:
$(function() {
$.getScript('http://localhost:8080/socket.io/socket.io.js', function() {
var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);
});
});
アプリ:
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
});
編集2: その他のデータ:
1つのログの代わりに、私はこれに置き換えます。
console.log(typeof(socket));
console.log(typeof(socket.socket));
console.log(typeof(socket.socket.sessionid));
戻り値:
object
object
undefined
期待される:
object
object
string
編集3:* スクリーンショット
編集4
奇妙なことに、これはうまくいきます。
var x;
for (x in socket.socket)
{
if (x == 'sessionid') {
console.log(socket.socket[x]);
}
}
解決 2
私はこれを信じられません。
socket.socket['sessionid']
それはうまくいきました。皆さんありがとう。
他のヒント
socket.socket.sessionid
確かに有効であり、セットが設定されるとセッションIDが含まれます。問題は、ソケットがまだ接続していないため(したがってセッションIDがないため)、コンソールに印刷する瞬間に設定されていないことです。
行を変更します
var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);
に
var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
console.log(socket.socket.sessionid);
});
そして、すべてが黄金であるべきです。
そもそもエラーが発生した理由を説明しようとします。
TCは、Chrome Devコンソールを見ていて、いくつかのデータを表示していました。しかし
console.log(typeof(socket));
と
console.log(typeof(socket.socket.sessionid));
しない 等しい出力を生成します。
Chromeコンソールを見ると、オブジェクトの近くに小さな「i」シンボルが表示されます。
これは、SessionIDにアクセスしようとすると、実際にはそれがないことを意味します。オープンプロパティでEGを試してください。オブジェクトの出力とは異なるものを示していることがわかります。
しかし、あなたがいつ クリック コンソールで、その場で生成します。
動作コードが必要な場合は、次のようになります。
// SERVER. Place it where you first _receive_ a connection from a client.
socket.emit('connected');
// This will emit connected message.
//It is a signal to your client, that there is an established CLIENT<->SERVER connetion
// CLIENT
socket.on('connected', function (){
console.log(socket.socket.sessionid);} // This produces correct sessionid
これで、これによりクライアント側に有効なセッションIDが生成されます。
ご覧のとおり、例では、既存のプロパティではないプロパティにアクセスしようとします。数ミリ秒が速すぎる;)
私はそれが今明確であることを願っています。