Mongodb 如何使用dart在mongo上创建一个简单的正面?

Mongodb 如何使用dart在mongo上创建一个简单的正面?,mongodb,dart,Mongodb,Dart,我希望使用dart在mongodb实例上创建一个漂亮而简单的层,但我无法做到: 给定mongodb实例“测试mongo层”: mongo shell: 使用测试mongo层切换到db测试mongo层 db.users.find() {“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“name”:“Toto”,“login”:“Toto”} {“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“name”:“Titi”,“l

我希望使用dart在mongodb实例上创建一个漂亮而简单的层,但我无法做到:

给定mongodb实例“测试mongo层”:

mongo shell:

使用测试mongo层切换到db测试mongo层 db.users.find() {“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“name”:“Toto”,“login”:“Toto”} {“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“name”:“Titi”,“login”:“Titi”}

和model.dart源文件:

类用户{
字符串名;
字符串登录;
用户(this.name,this.login)
User.fromJson(映射){
name=map['name'];
login=map['login'];
}
}
和persistence.dart源文件:

import'包:mongo_-dart/mongo_-dart.dart';
导入“../lib/model.dart”;
类持久层{
Db_mongodb;
PersistenceLayer(此.\u mongodb)
列出getUsers(){
列表用户=新列表();
_mongodb.open()然后((o){
返回_mongodb.collection('users').find().forEach((jsonUser){
User=new User.fromJson(jsonUser);
用户。添加(用户);
});
}).然后((jsonUsers){
_mongodb.close();
});
返回用户;
}
}
启动以下测试时:

import'包:mongo_-dart/mongo_-dart.dart';
导入“包:unittest/unittest.dart”;
导入“../lib/model.dart”;
导入“../lib/persistence.dart”;
main(){
Db=新的Db(“mongodb://127.0.0.1/test-mongo-layer");
测试('测试获取用户',(){
PersistenceLayer persistence=新的PersistenceLayer(db);
var users=persistence.getUsers();
expect(users.length,2);
}
}
然后a得到一个异常:

未捕获错误:应为:
实际:您在
getUsers
中混合了同步和异步代码。
users
的填充在返回
getUsers()
之后完成。这就是
users
为空的原因

为了更好地理解
Future
和异步代码,您可以查看一下

getUsers()
的工作版本应如下所示(未测试):

导入'dart:async';
进口“包装:蒙哥乌飞镖/蒙哥乌飞镖.飞镖”;
导入“../lib/model.dart”;
类持久层{
Db_mongodb;
PersistenceLayer(此.\u mongodb)
未来的getUsers(){
列表用户=新列表();
返回_mongodb.open(){
_mongodb.collection('users').find().forEach((jsonUser){
User=new User.fromJson(jsonUser);
用户。添加(用户);
});
}).完成时(){
_mongodb.close();
})。然后(())=>用户;
}
}

基本上,您返回完整的
未来
链,在最后一个
中,然后
返回
用户

,因此我无法让getUsers()成为同步只要它使用提供异步函数的mongo_dart库?确切地说!异步是有传染性的。一旦在函数中有一个
未来
,您几乎总是必须使函数返回一个
未来