1

MongoDB からデータを取得する簡単な方法があります。

import 'package:mongo_dart/mongo_dart.dart';

Future find() {
  return _db.open().then((_) {
    return _db.collection('foo').find().toList();
  }).then((val) {
    _db.close();
    return val;
  });
}

このメソッドを 1 回呼び出すと機能します。2 回続けて呼び出すと、NoSuchMethodError: method not found: 'query'.

誰でも問題を説明できますか?

完全なスタックトレースは次のとおりです。

Uncaught Error: The null object does not have a method 'query'.

NoSuchMethodError: method not found: 'query'
Receiver: null
Arguments: [Instance of 'MongoQueryMessage']
Stack Trace: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#1      Db.queryMessage (package:mongo_dart/src/database/db.dart:174:28)
#2      Cursor.nextObject (package:mongo_dart/src/database/cursor.dart:68:29)
#3      Cursor._nextEach (package:mongo_dart/src/database/cursor.dart:102:15)
#4      Cursor.forEach (package:mongo_dart/src/database/cursor.dart:122:14)
#5      Cursor.toList (package:mongo_dart/src/database/cursor.dart:128:24)
#6      DbConnection.find.<anonymous closure> (package:schafkopfer_server/src/schafkopfer/data.dart:49:52)
#7      _rootRunUnary (dart:async/zone.dart:730)
#8      _RootZone.runUnary (dart:async/zone.dart:864)
#9      _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:488)
#10     _Future._propagateToListeners (dart:async/future_impl.dart:571)
#11     _Future._complete (dart:async/future_impl.dart:317)
#12     Future.forEach.nextElement (dart:async/future.dart:303)
#13     _rootRunUnary (dart:async/zone.dart:730)
#14     _RootZone.runUnary (dart:async/zone.dart:864)
#15     _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:488)
#16     _Future._propagateToListeners (dart:async/future_impl.dart:571)
#17     _Future._completeWithValue (dart:async/future_impl.dart:331)
#18     _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:393)
#19     _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:23)
#20     _asyncRunCallback (dart:async/schedule_microtask.dart:32)
#21     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:128)

mongo_dartの問題をオープンしました。

4

2 に答える 2

2

非同期コードと同期コードを混在させていると思いますが、ほとんどの状況では機能しません。

メソッドは Future を返しますが、同期モードで 2 回目のfind呼び出しを試みています。句内から 2 度目findに呼び出す場合、コードは機能します。findthen

main() {
  var mongoTest = new MongoTest();
  mongoTest.find().then((x) {
    print('first find $x');
    mongoTest.find().then((x) => print('second find $x'));
  });
}

したがって、mongo_dart Db インスタンスは閉じた後に開くことができますが、その例ではほとんど意味がありません。

Web スタックのサーバー側を実行しようとしている場合は、既存のフレームワークを確認することをお勧めします。例えばレッドストーン。

http://redstonedart.org/2014/07/14/managing-database-connection-with-redstondart/

于 2014-07-25T04:40:59.803 に答える
1

バグ レポートでリンクした Gist によると、1 回目と 2 回目の呼び出しの唯一の違いは、同じdbインスタンスを使用することです。インスタンスを閉じた後、インスタンスを再度開くことはできないと思います。開く前に毎回新しいインスタンスを作成すると、問題が解決するはずです。

db 接続を集中的に使用する場合は、開いたままにしておく方がよい場合があります。

于 2014-07-24T18:35:39.527 に答える