サーバにて実行時エラー発生
HillTopTRPG opened this issue · comments
console
TypeError: this.driver.eventEmitter.off is not a function
nekostore/src/driver/basic/impl/BasicQuery.ts
Line 155 in 3e72081
実行時のサーバプログラム(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();
インタフェース定義的には問題ないように見えますが…
ご調査お願いいたします。
ひとまずNode12/10でそのコードを実行しましたが再現しません。クライアントコードとビルド環境、Nodeのバージョンをあわせた再現セットを用意していただけると解決できると思いますが……
nekostoreを導入した際のnpm installで、内部的にimportして使っているモジュール群の一部が取得漏れていたことがあって、起動時にエラーを吐き出してきて「ん?」ってなったことがあって、それと似た事象かなとはアタリをつけてはいます。
小規模なnekostore検証用の環境を新しく作って、それをGitリポジトリにしてみようと思うので、そこで同じ事象が出たら改めて報告申し上げたいと思います。
(それで成功したなら私もそれを使えばいいし、それでエラーが再現するならそれを再現環境として利用いただけると思うので)
直近は私の方もフレームワークっぽいものを集中的に作ってしまわないと頭がこんがらがるので、申し訳ないですが続報は気長にお待ちくださいませ。
素晴らしいライブラリに感謝です。
😍 よろしくおねがいします。
改めて着手してみました。
状況は全く変わらない感じです。
今回はサーバ資材を丸々リポジトリ化しましたので、再現性をご確認いただけるかと思います。
https://github.com/HillTopTRPG/quoridorn-server
お手数ですがご確認よろしくお願いいたします。
こういうクライアントコード書いて実行してみましたが、再現しません。(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);
});
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()
と修正すると、サーバエラーが発生することを確認しました。
ご検証されたクライアントコードだと
await unsubscribe1
となっていて、メソッドを呼び出せていないと思います。
await unsubscribe1()
と修正すると、サーバエラーが発生することを確認しました。
適当さがバレバレでした!これでだいたい特定できそうですが……
とりあえずjs-domで誤魔化しながら実行しましたが特に問題なさそうです。
発生するのはクライアント側ですか?サーバー側ですか?また、クライアント側のビルド環境と実行環境を教えて下さい。
エラーが発生するのはサーバ側です。
OSはWindowsです。
>node --version
v8.12.0
>npm --version
6.4.1
情報ありがとうございます。EventEmitter.prototype.off
が追加されたのは10.xからなので、9以前はサポート対象外と明示することにします。
なるほど…!!
そういうことだったんですね!!!
ちゃんとLTS推奨版のバージョンを落としてきます…!
(バージョン古くてすいませんでした)
ありがとうございます!
🙇♀