1

我正在使用Google Cloud Endpoints管理API,並且正在努力處理一個奇怪的,隨機發生的錯誤。錯誤僅在生產中發生,單元測試通過屬性。GAE端點錯誤:預期的FooBar實例,得到FooBar()

我有以下型號:

class UserFacebookData(ndb.Model): 
    facebook_id = ndb.StringProperty(required=True, indexed=True) 
    facebook_token = ndb.StringProperty(required=True, indexed=True) 

class User(ndb.Model, Entity): 
    created = ndb.DateTimeProperty(auto_now_add=True, indexed=True) 
    username = ndb.StringProperty(indexed=True) 
    facebook_data = ndb.StructuredProperty(UserFacebookData, indexed=False) 

並使用此創建一個用戶

ufd = UserFacebookData(facebook_id=some_api_data, facebook_token=some_api_data) 
user = User(username=some_api_data, facebook_data=ufd) 
user.save() 

或更新一個

ufd = UserFacebookData(facebook_id=some_api_data, facebook_token=some_api_data)  
user = get_from_db(some_api_data) 
user.facebook_data = ufd 
user.save() 

(編輯:保存()是方法的父實體類,做一個put()+一些memcached的東西)

而得到的,不時更新,當用戶,以下錯誤

Expected UserFacebookData instance, 
got UserFacebookData(facebook_id=u'xxx', facebook_token=xxx')) 

然而,痕跡(打印和檢查UFD/UserFacebookData實例的類型),表明它是正確創建,並且用戶還存在

# print user.username 
my_username 
# print UserFacebookData 
UserFacebookData(facebook_id=u'xx', facebook_token=xx') 
# print type(UserFacebookData) 
UserFacebookData<facebook_id=StringProperty('facebook_id', required=True), 
facebook_token=StringProperty('facebook_token', required=True)> 

我不能看到我錯過了什麼。有人已經體驗過 - 希望能夠修復它嗎?以下是完整的錯誤堆棧

Encountered unexpected error from ProtoRPC method implementation: BadValueError (Expected UserFacebookData instance, got UserFacebookData(facebook_id=u'xx', facebook_token=xx')) 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/wsgi/service.py", line 181, in protorpc_service_app 
response = method(instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/endpoints-1.0/endpoints/api_config.py", line 1329, in invoke_remote 
return remote_method(service_instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/remote.py", line 412, in invoke_remote_method 
response = method(service_instance, request) 
    File "/base/data/home/apps/s~yapme-web/alpha2.377359917212322950/api/helpers.py", line 43, in method 
return func(*args, **kwargs) 
    File "/base/data/home/apps/s~xx-web/alpha2.377359917212322950/api/user.py", line 25, in users_create 
user = User.create(request) 
    File "/base/data/home/apps/s~xx-web/alpha2.377359917212322950/entities/users.py", line 168, in create 
user.facebook_data = facebook_data 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1339, in __set__ 
    self._set_value(entity, value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1084, in _set_value 
value = self._do_validate(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1031, in _do_validate 
value = self._call_shallow_validation(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1223, in _call_shallow_validation 
return call(value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1270, in call 
newvalue = method(self, value) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 2269, in _validate 
(self._modelclass.__name__, value)) 
BadValueError: Expected UserFacebookData instance, got UserFacebookData(facebook_id=u'xx', facebook_token=xx') 

回答

0

save()不是ndb語法。我想你想要put()。此外,你應該能夠只使用一個字典來設置StructuredProperty值:

要創建用戶:

ufd = {"facebook_id":some_api_data, "facebook_token":some_api_data} 
user = User(username=some_api_data, facebook_data=ufd) 
user.put() 

要更新用戶:

ufd = {"facebook_id":some_api_data, "facebook_token":some_api_data} 
user = get_from_db(some_api_data) 
user.facebook_data = ufd 
user.put() 

這應該讓你同時保存兩者。否則,您最終可能會遇到最終一致性問題。這很可能是問題,因爲你說它只是間歇性地發生在生產中。

+0

但它在創建用戶時起作用,並且用戶本身之前沒有保存UserFacebookData對象? – apassant

+0

使用put()並仍然有錯誤 – apassant

+0

請參閱編輯。使用'put()'顯示代碼 – GAEfan