google-app-engine - 尝试使用Dart在App Engine上的gcloud DB中插入元素时出错

标签 google-app-engine dart google-cloud-datastore gcloud

我正在对Client Server Example进行变体,它仅使用Redstone框架返回JSON字符串。它有3条路线:

  • / =>获取整个列表或名称
  • /add/name =>将“名称”添加到列表中并获取列表
  • /remove/name =>从列表中删除“名称”并获取列表

  • 当我在本地测试时,一切正常,但是,当我部署到App Engine时,尝试向gcloud db中添加元素时出现错误。错误是

    Exception: Tried to insert 1 entities, but response seems to indicate we inserted 0 entities. package:appengine/src/api_impl/raw_datastore_v3_impl.dart 416:11 DatastoreV3RpcImpl.commit. dart:isolate _RawReceivePortImpl._handleMessage



    您可以在此URL上实时测试错误http://web3.arista-dev.appspot.com/add/my-name

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

    import 'dart:io';
    import 'dart:async';
    
    import 'package:shelf/shelf.dart' as shelf;
    import 'package:redstone/server.dart' as app;
    
    import 'package:restonetest/model.dart';
    
    import 'package:gcloud/db.dart';
    import 'package:appengine/appengine.dart';
    
    Key get itemsRoot => context.services.db.emptyKey.append (ItemRoot, id: 1);
    
    DatastoreDB db = context.services.db;
    
    Future<List<Item>> queryItems ()
    {
        var query = context.services.db.query (Item, ancestorKey: itemsRoot)
            ..order ('name');
    
        return query.run ().toList ();
    }
    
    Future<List<Item>> addItemToDB (Item item)
    {
        return db.query(Item, ancestorKey: itemsRoot).run()
    
            .any((i) => i.name == item.name)
    
            .then((exists) 
            {
                    return ! exists ? db.commit(inserts: [item]) : false;
            });
    }
    
    @app.Route("/")
    helloWorld() => queryItems();
    
    @app.Route('/add/:name')
    addItem (String name)
    {
        return addItemToDB (new Item.create (name, itemsRoot)).then ((_) 
        {
            print (name);    
            return helloWorld();
        });
    }
    
    @app.Route('/delete/:name')
    deleteItem (String name) 
    {
        var query = db.query (Item, ancestorKey: itemsRoot)..filter('name =', name);
    
        return query.run().toList().then((list) 
        { 
            var toDelete = list.map((i) => i.key).toList();
            return db.commit(deletes: toDelete);
        })
    
        .then((_) => helloWorld());
    }
    
    main() {
        app.setupConsoleLog();
        app.setUp();
        runAppEngine(app.handleRequest);
        //app.start();
    }
    

    最佳答案

    目前,package:appengine仅允许一个在请求处理程序内部调用API服务:

    每个请求处理程序调用将获得一组新的服务。这允许package:appengine给每个请求处理程序例如一个不同的日志服务实例。这样就可以按请求将所有日志记录API调用分组。

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

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

    改变中

    DatastoreDB db = context.services.db;
    



    DatastoreDB get db => context.services.db;
    

    应该可以解决该问题,因为每次都会从请求处理程序区域中重新获取服务对象。

    这么说:

    a)错误被误认为是误导性报告,并将在package:appengine中修复

    b)在不久的将来,我们将允许后台任务/在请求处理程序之外进行API调用的任务。目前尚缺,但将予以实现。

    我希望这有帮助。

    关于google-app-engine - 尝试使用Dart在App Engine上的gcloud DB中插入元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089890/

    相关文章:

    python - dev_appserver.py 没有那个文件或目录

    dart - 如何在 Dart 中拆分 Double 值?

    java - Cross Group (XG) 交易中超过 5 个实体组

    java - 如何使用 Objectify 更新数据存储实体?

    dart - 如何在Dart的web_ui中构造 “Controller”?

    java - 客观化和关系

    google-app-engine - 应用程序引擎上的故障安全数据存储区更新

    python - 在 appengine 中使用较少的数据存储小操作

    google-app-engine - 从 Go Runtime 获取 Google Cloud Storage 上上传文件的公共(public)链接

    z-index - 我们如何使用Dart语言应用CSS样式?