esnya / nekostore

Realtime synchronized datastore like Firestore for TypeScript.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

サーバにて実行時エラー発生

HillTopTRPG opened this issue · comments

console

TypeError: this.driver.eventEmitter.off is not a function

this.driver.eventEmitter.off(this.path, wrapper);

実行時のサーバプログラム(BasicDriverをオプションなしで使用)

import BasicDriver from "nekostore/lib/driver/basic";
import SocketDriverServer from "nekostore/lib/driver/socket/SocketDriverServer";

async function server(): Promise<() => void> {
  const driver = new BasicDriver();
  const server = require("socket.io").listen(2222);
  server.on("connection", (socket: any) => {
    console.log("Connected", socket.id);
    new SocketDriverServer(driver, socket);
  });

  return (): void => server.close();
}

server();

インタフェース定義的には問題ないように見えますが…
ご調査お願いいたします。

commented

ひとまずNode12/10でそのコードを実行しましたが再現しません。クライアントコードとビルド環境、Nodeのバージョンをあわせた再現セットを用意していただけると解決できると思いますが……

nekostoreを導入した際のnpm installで、内部的にimportして使っているモジュール群の一部が取得漏れていたことがあって、起動時にエラーを吐き出してきて「ん?」ってなったことがあって、それと似た事象かなとはアタリをつけてはいます。

小規模なnekostore検証用の環境を新しく作って、それをGitリポジトリにしてみようと思うので、そこで同じ事象が出たら改めて報告申し上げたいと思います。
(それで成功したなら私もそれを使えばいいし、それでエラーが再現するならそれを再現環境として利用いただけると思うので)

直近は私の方もフレームワークっぽいものを集中的に作ってしまわないと頭がこんがらがるので、申し訳ないですが続報は気長にお待ちくださいませ。

素晴らしいライブラリに感謝です。

commented

😍 よろしくおねがいします。

改めて着手してみました。
状況は全く変わらない感じです。

今回はサーバ資材を丸々リポジトリ化しましたので、再現性をご確認いただけるかと思います。
https://github.com/HillTopTRPG/quoridorn-server

お手数ですがご確認よろしくお願いいたします。

commented

こういうクライアントコード書いて実行してみましたが、再現しません。(Windows上のNode 12.10.0で実行)

import Nekostore from 'nekostore';
import SocketDriver from 'nekostore/lib/driver/socket';
import * as Socket from 'socket.io-client';

const host = '127.0.0.1';
const port = 2222;

async function client(): Promise<void> {
  const socket = Socket.connect(`http://${host}:${port}`);

  const driver = new SocketDriver({ socket });
  const nekostore = new Nekostore(driver);

  const c1Ref = nekostore.collection<any>('c1');

  const unsubscribe1 = await c1Ref.onSnapshot(snapshot => {
    snapshot.docs.forEach(doc => {
      console.log(doc.ref.id, doc.type, doc.data);
    });
  });


  const d1Ref = await c1Ref.doc('d1');
  await d1Ref.set({ foo: 'a', bar: 0 });

  await unsubscribe1;
  socket.disconnect();
}
client().then(() => {}, err => {
  console.error(err);
  process.exit(err);
});
commented

nekostoreを導入した際のnpm installで、内部的にimportして使っているモジュール群の一部が取得漏れていたことがあって、起動時にエラーを吐き出してきて「ん?」ってなったこと

これはdependenciesに漏れがあったので修正済みです。

ありがとうございます。

確かにご提示いただいたテストコードだとこちらでも事象が発生しなかったです。
下記のクライアントコードだと発生するようです。
お手数ですが試していただけますでしょうか。

interface Data {
  foo: string;
  bar?: number;
}
//////////////////////////////

  const socket = SocketClient.connect("http://localhost:2222");
  const driver = new SocketDriver({ socket });
  const nekostore = new Nekostore(driver);

  const c1Ref = nekostore.collection<Data>("c1");
  const unsubscribe1 = await c1Ref.onSnapshot(snapshot => {
    snapshot.docs.forEach(doc => {
      window.console.log(doc.ref.id, doc.type, doc.data);
    });
  });

  const d1Ref = await c1Ref.doc("d1");
  const unsubscribe2 = await d1Ref.onSnapshot(snapshot => {
    window.console.log(snapshot.exists(), snapshot.data);
  });

  await d1Ref.set({ foo: "a", bar: 0 });
  await d1Ref.update({ bar: 1 });
  await d1Ref.delete();

  await c1Ref.add({ foo: "b" });

  await unsubscribe1();
  await unsubscribe2();

ご検証されたクライアントコードだと
await unsubscribe1
となっていて、メソッドを呼び出せていないと思います。
await unsubscribe1()
と修正すると、サーバエラーが発生することを確認しました。

commented

ご検証されたクライアントコードだと
await unsubscribe1
となっていて、メソッドを呼び出せていないと思います。
await unsubscribe1()
と修正すると、サーバエラーが発生することを確認しました。

適当さがバレバレでした!これでだいたい特定できそうですが……

とりあえずjs-domで誤魔化しながら実行しましたが特に問題なさそうです。
発生するのはクライアント側ですか?サーバー側ですか?また、クライアント側のビルド環境と実行環境を教えて下さい。

エラーが発生するのはサーバ側です。
OSはWindowsです。

>node --version
v8.12.0
>npm --version
6.4.1
commented

情報ありがとうございます。EventEmitter.prototype.offが追加されたのは10.xからなので、9以前はサポート対象外と明示することにします。

なるほど…!!
そういうことだったんですね!!!

ちゃんとLTS推奨版のバージョンを落としてきます…!
(バージョン古くてすいませんでした)

ありがとうございます!

commented

🙇‍♀