Google app engine 尝试使用Dart将元素插入App Engine上的gcloud DB时出错

Google app engine 尝试使用Dart将元素插入App Engine上的gcloud DB时出错,google-app-engine,dart,google-cloud-datastore,gcloud,Google App Engine,Dart,Google Cloud Datastore,Gcloud,我正在使用Redstone框架对只返回JSON字符串的函数进行修改。它有三条路线: /=>获取整个列表或名称 /add/name=>将“name”添加到列表中并获取列表 /remove/name=>从列表中删除“name”并获取列表 当我在本地测试时,一切正常,但是,当我部署到App Engine时,我在尝试向gcloud db添加元素时出错。错误是 异常:尝试插入1个实体,但响应似乎表明 我们插入了0个实体。 包:appengine/src/api_impl/raw_datastore_v

我正在使用Redstone框架对只返回JSON字符串的函数进行修改。它有三条路线:

  • /
    =>获取整个列表或名称
  • /add/name
    =>将“name”添加到列表中并获取列表
  • /remove/name
    =>从列表中删除“name”并获取列表
当我在本地测试时,一切正常,但是,当我部署到App Engine时,我在尝试向gcloud db添加元素时出错。错误是

异常:尝试插入1个实体,但响应似乎表明 我们插入了0个实体。 包:appengine/src/api_impl/raw_datastore_v3_impl.dart 416:11 DatastoreV3RpcImpl.commit。飞镖:隔离 _RawReceivePortImpl.\u handleMessage

您可以在此URL上实时测试错误

删除似乎也不起作用,但不会产生错误。这是我的密码:

导入'dart:io';
导入“dart:async”;
导入“包装:货架/货架.省道”作为货架;
将“package:redstone/server.dart”作为应用程序导入;
导入“包:restonest/model.dart”;
导入“包:gcloud/db.dart”;
导入“package:appengine/appengine.dart”;
Key get itemsRoot=>context.services.db.emptyKey.append(ItemRoot,id:1);
DatastoreDB=context.services.db;
未来查询项()
{
var query=context.services.db.query(Item,ancestorKey:itemsRoot)
…订单(“名称”);
return query.run().toList();
}
未来附加项B(项目)
{
return db.query(Item,ancestorKey:itemsRoot).run()
.any((i)=>i.name==item.name)
.然后((存在)
{
return!exists?db.commit(inserts:[项目]):false;
});
}
@附件路线(“/”)
helloWorld()=>queryItems();
@app.Route(“/add/:name”)
addItem(字符串名称)
{
返回addItemToDB(new Item.create(name,itemsRoot))。然后(()
{
印刷品(姓名);
返回helloWorld();
});
}
@app.Route('/delete/:name')
deleteItem(字符串名称)
{
var query=db.query(Item,ancestorKey:itemsRoot)…过滤器('name=',name);
返回query.run().toList().then((列表)
{ 
var toDelete=list.map((i)=>i.key.toList();
返回db.commit(删除:toDelete);
})
.然后((u)=>helloWorld());
}
main(){
app.setupConsoleLog();
app.setUp();
runAppEngine(应用程序HandlerRequest);
//app.start();
}

目前,package:appengine只允许在请求处理程序中调用API服务

每个请求处理程序调用将获得一组新的服务。这允许package:appengine为每个请求处理程序提供一个不同的日志服务实例。这允许按请求对所有日志API调用进行分组

在dart/package:appengine中实现这一点的方法是使用区域。对于每个传入的请求,package:appengine使用API服务创建一个新区域,并调用其中的请求处理程序。然后处理程序可以使用“context.services.”进行API调用

因此,上面发布的程序中存在的问题是,DatastoreDB服务从第一个请求中得到缓存(全局字段被延迟初始化),并且可能不再适用于后续请求

改变

DatastoreDB=context.services.db;

DatastoreDB get db=>context.services.db;
应该可以解决这个问题,因为每次都会从请求处理程序区域重新获取服务对象

这就是说:

a) 该错误具有误导性,将在package:appengine中修复

b) 在不久的将来,我们将允许后台任务/任务在请求处理程序之外进行API调用。这一点目前还不存在,但将得到实施

我希望这有帮助