gpt4 book ai didi

mongodb - 如何使用 dart 在 mongo 上创建一个简单的外观?

转载 作者:行者123 更新时间:2023-12-03 03:06:49 25 4
gpt4 key购买 nike

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

给定一个 mongodb 实例“test-mongo-layer”:

蒙戈壳:

使用 test-mongo-layer 切换到 db test-mongo-layer
db.users.find()
{“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“名称”:“Toto”,“登录”:“toto”}
{“_id”:ObjectId(“524b1bf8fbfe21c9c4cdb772”),“名称”:“蒂蒂”,“登录”:“蒂蒂”}

还有一个 model.dart 源文件:

class User {
String name;
String login;

User(this.name, this.login)

User.fromJson(Map map) {
name = map['name'];
login = map['login'];
}
}

还有一个 persistence.dart 源文件:

import 'package:mongo_dart/mongo_dart.dart';
import '../lib/model.dart';

class PersistenceLayer{

Db _mongodb;

PersistenceLayer(this._mongodb)

List<User> getUsers() {

List<User> users = new List();

_mongodb.open().then((o){

return __mongodb.collection('users').find().forEach((jsonUser){
User user = new User.fromJson(jsonUser);
users.add(user);
});

}).then((jsonUsers){

_mongodb.close();

});

return users;
}

}

当我启动以下测试时:

import 'package:mongo_dart/mongo_dart.dart';
import 'package:unittest/unittest.dart';
import '../lib/model.dart' ;
import '../lib/persistence.dart' ;
main() {

Db db = new Db("mongodb://127.0.0.1/test-mongo-layer");

test('Test get users', () {

PersistenceLayer persistence = new PersistenceLayer(db);
var users = persistence.getUsers();
expect(users.length, 2);
}

}

然后出现异常:

Uncaught Error :预期:<2>
实际:<0><

这很简单,但它不起作用,我必须弄乱 future ,因为当我在调试时执行它时甚至没有执行代码......

解决方案 : 感谢亚历山大

persistence.dart 源文件:

  Future<List<User>> getUsers() {
List<User> users = new List();
return _mongodb.open()
.then((_){
return _mongodb.collection('users').find().forEach((jsonUser){
User user = new User.fromJson(jsonUser);
users.add(user);
});
})
.then((_) {
return users;
})
.whenComplete((){
_mongodb.close();
});
}

测试 :

test('Test get users', () {
PersistenceLayer persitence = new MongoPersistence(db);
Future<List<User>> usersFuture = persistence.getUsers();
usersFuture.then((users) => expect(users.length, 2) );
});

最佳答案

您在 getUsers 中混合了同步和异步代码. users的填写之后完成getUsers()被退回。这就是为什么users是空的。

为了更好地理解 Future和异步代码你可以看看The Event Loop and Dart .
getUsers() 的工作版本应如下所示(未经测试):

import 'dart:async';
import 'package:mongo_dart/mongo_dart.dart';
import '../lib/model.dart';

class PersistenceLayer{
Db _mongodb;

PersistenceLayer(this._mongodb)

Future<List<User>> getUsers() {
List<User> users = new List();
return _mongodb.open().then((_){
_mongodb.collection('users').find().forEach((jsonUser){
User user = new User.fromJson(jsonUser);
users.add(user);
});
}).whenComplete((_){
_mongodb.close();
}).then((_) => users);
}
}

基本上你返回完整的 Future链和最后 then你返回 users .

关于mongodb - 如何使用 dart 在 mongo 上创建一个简单的外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19132562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com