我一直在审查Apollo文档,但我没有看到如何在Apollo客户端中处理服务器错误的信息.
例如,假设服务器要么:
如何在客户端处理?Apollo目前失败,出现以下错误:
未处理(在react-apollo中)错误:GraphQL错误:不能......
我想避免这种情况发生并处理这些错误.我怎么能用React Apollo这样做?
以供参考:
我目前正在使用React-Apollo和Redux.
在下面的查询中,$ isComplete和$ isValid作为字符串返回.但是,它们保存为布尔值.如何获取要返回的这些字段的布尔表示?
query =
"SELECT
data #>> '{id}' AS id,
data #>> '{name}' AS name,
data #>> '{curator}' AS curator,
data #> '{$isValid}' as \"$isValid\",
data #> '{customer}' as customer,
data #> '{$createdTS}' as \"$createdTS\",
data #> '{$updatedTS}' as \"$updatedTS\",
data #> '{$isComplete}' as \"$isComplete\",
(count(keys))::numeric as \"numProducts\"
FROM
appointment_intakes,
LATERAL jsonb_object_keys(data #> '{products}') keys
GROUP BY id"
Run Code Online (Sandbox Code Playgroud) 我一直在使用Polymer开发一个chrome扩展已有一段时间了,我有一些关于在它当前状态下释放它的担忧.我想听听一些防止我遇到的以下问题的策略:
1)将Polymer加载到页面中会泄漏到全局名称空间中.Polymer不会捆绑到JS文件中,而是以html页面的形式出现,并要求用户使用HTML导入将其加载到页面中.AFAIK,内容脚本只允许CSS和JS,但不允许HTML.要解决此问题,我通过动态生成链接元素并将其添加到页面中来包含它:
function loadUrl(url) {
return new Promise(
function(resolve, reject) {
var link = document.createElement('link');
link.setAttribute('rel', 'import');
link.setAttribute('href', url);
link.onload = function() {
resolve(url);
};
document.head.appendChild(link);
});
}
loadUrl(chrome.extension.getURL("polymer/polymer.html")).
then( loadUrl(chrome.extension.getURL("my/component.html")) )
Run Code Online (Sandbox Code Playgroud)
一旦加载到主机页面,它就不像内容脚本那样独立运行,如果页面已经加载了Polymer ,则会导致命名空间冲突.
2)聚合物不会告诉您何时装入并准备使用.聚合物(当前)在加载时不会触发事件,因此,我的组件有时会在聚合物进入并断开之前加载.
为了缓解这个问题,我在结束时触发了一个自定义事件polymer-micro.html(这是Polymer的定义):
var ev = new CustomEvent('polymer-loaded');
document.dispatchEvent(ev);
Run Code Online (Sandbox Code Playgroud)
3)Polybuild工具不会为chrome扩展生成正确的代码.虽然它很有用,但它会在命名空间之外生成一个单独的javascript文件,dom-module从而导致命名空间leak进入全局窗口对象.例如,如果在我的模块中导入jQuery,Polybuild将生成一个包含DOM模块之外的jQuery的JS文件,从而将其附加到主机窗口对象 - 这是Chrome扩展中的一个大禁忌.
感谢您的反馈.
在撰写本文时,我正在使用Polymer 1.2.3
javascript web-component google-chrome-extension polymer polymer-1.0
我正处于一个十字路口,决定标签应该是他们自己的资源还是笔记的嵌套属性.这个问题涉及RESTful设计和数据库存储.
上下文:我有一个笔记资源.用户可以有很多笔记.每个音符可以有很多标签.
功能目标:
我需要创建路由来执行以下操作:
1)获取所有用户标记.类似于:GET /users/:id/tags
2)删除与笔记相关联的标签.
3)将标签添加到特定注释.
数据/性能目标
1)获取用户标签应该很快.这是为了"自动提示"/"自动完成".
2)防止重复(尽可能多).我希望尽可能多地重用标签,以便能够按标签查询数据.例如,我想减轻用户在标签"超级英雄"已经存在时键入标签(如"超级英雄")的情况.
话虽如此,我看到它的方式,有两种方法可以在注释资源上存储标签:
1)标签作为嵌套属性.例如:
type: 'notes',
attributes: {
id: '123456789',
body: '...',
tags: ['batman', 'superhero']
}
Run Code Online (Sandbox Code Playgroud)
2)标签作为自己的资源.例如:
type: 'notes',
data: {
id: '123456789',
body: '...',
tags: [1,2,3] // <= Tag IDs instead of strings
}
Run Code Online (Sandbox Code Playgroud)
上述任何一种方法都可以工作,但我正在寻找一种能够实现可扩展性和数据一致性的解决方案(想象一百万个笔记和一千万个标签).在这一点上,我倾向于选项#1,因为它更容易处理代码,但可能不一定是正确的选择.
我非常有兴趣听到关于不同方法的一些想法,特别是因为我找不到关于这个主题的类似问题.
更新 感谢您的回答.对我来说最重要的事情之一是确定为什么使用一个优于另一个是有利的.我希望答案包含一些赞成/反对清单.
该应用程序
我有一个Web应用程序,当前使用AppCache进行离线功能,因为系统用户需要离线创建文档.该文档首先是离线创建的,当互联网访问可用时,用户可以单击"同步",将文档发送到服务器并将其另存为修订版.更具体地说,应用程序不会将更改增量保存为修订版(修改的确切字段),而是保存整个文档的全部内容.换句话说,保存了"快照"文档.
问题
用户可以从不同的浏览器和设备登录并处理他们的文档.当他们单击"同步"时,如果服务器的文档较新,则整个客户端的版本将被服务器覆盖.这导致一个主要问题,如下图所示.
上面的场景是因为当前的实现不依赖于增量(小的更改)而是依赖于快照修订.
一些问题
1)我的研究表明,我应该将"同步"机制升级为以增量表示(可以独立应用的小变化).这是一个合理的方法吗?
2)每个delta应该独立应用吗?
2)根据我的研究,修订增量有一个数值而不是时间戳.它的价值应该是什么?我如何确保服务器和客户端都同意修订号应该是什么?
堆栈信息
javascript synchronization offline-caching indexeddb html5-appcache
我开发的chrome扩展通过HTML导入将Polymer和其他Web组件注入主页,而不是使用内容脚本的典型方法 - 它自动在一个孤立的世界中运行.
这背后的原因与两件事有关:
由于这些限制,我不得不求助于将我的组件加载到主机页面中<head>,如此处所述.
我面临的一个明显问题是我的javascript与主机页面的javascript [在某些网站上]冲突,因为我用来注入我的依赖项的方法不会在"孤立的世界"中运行.
到目前为止,我已经通过gulp任务重命名Polymer和我的组件来解决大部分问题,以避免冲突,但不幸的是它并不完美,需要更强大的方法.
最后我的问题:是否有可能为我的javascript创建一个"孤立的世界"?也许另一个文件对象?如果没有,是否有任何策略可以确保我的代码单独运行?
更新:
你们中的一些人建议使用IIFE,这是我迄今为止所使用的.我正在寻找一个孤立世界的答案,类似于谷歌浏览器如何运行扩展.这主要是因为Polymer必须附加到全局窗口对象.
我有一个管理用户的pouchdb应用程序.
用户拥有一个本地pouchDB实例,可以使用单个couchDB数据库进行复制.很简单.
这是事情变得有点复杂的地方.我在我的设计中引入了"群体"的概念.组将是不同的couchDB数据库,但在本地,它们应该是用户数据库的一部分.
我在pouchDB网站上阅读了一些关于"花哨复制"的内容,这似乎是我追求的解决方案.
现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到一个本地数据库?一些代码示例将是超级的.
从下面的图表中,您将注意到我需要根据用户所在的组动态添加数据库.对我的设计的批评也将受到赞赏. 谢谢!

流量应该是这样的:
localUserDBvar groupDB = new PouchDB('remote-group-url');
groupDB.replicate.to(localUserDB);localUserDB.replicate.to(groupDB)我是否需要过滤复制?)编辑:诺兰建议我调查couchDB"角色"系统来解决我的问题.一旦我搞清楚,我会在这里发布.
我的团队最近采用了json api惯例.在api排序的文档中没有解决.
然而,它们确实在推荐页面中解决了过滤问题,但在我看来,排序不是过滤的一部分,因为过滤用于减少集合,而排序用于重新排序集合.
鉴于json api惯例,我想知道:
不幸的是,我没有看到一个问题,问我到底需要什么,所以我决定发一个.
问题:我有一个加载iframe边栏的chrome扩展.在初始加载时,用户需要使用他们选择的Google帐户登录.此外,如果用户访问实际站点(在新选项卡中),则应向用户显示相同的身份验证流程(理想情况下).
我目前使用Google帐户选择器,当使用网站的iframe版本时,我遇到了一些问题,主要是:
拒绝在一个框架中显示" https://accounts.google.com/AccountChooser?continue=https://accounts.google ... t.com%26from_login%3D1%26as%3D473effc061cc82d5&btmpl = authsub&scc = 1&oauth = 1',因为它已设置'X-Frame-Options'到'DENY'.
总结一下,我需要的是:
javascript iframe google-authentication google-chrome-extension oauth-2.0
我有一个在创建或更新时触发的upsert查询.在更新时,Apollo将结果集成到缓存中,但在创建时却没有.
这是查询:
export const UPSERT_NOTE_MUTATION = gql`
mutation upsertNote($id: ID, $body: String) {
upsertNote(id: $id, body: $body) {
id
body
}
}`
Run Code Online (Sandbox Code Playgroud)
我的客户:
const graphqlClient = new ApolloClient({
networkInterface,
reduxRootSelector: 'apiStore',
dataIdFromObject: ({ id }) => id
});
Run Code Online (Sandbox Code Playgroud)
来自服务器的响应是相同的:返回两者id并body返回,但Apollo不会data自动将新ID添加到缓存对象中.
是否有可能让Apollo自动添加新对象而data不会触发后续获取?
这是我的数据存储的样子:
UPDATE
根据文档,该函数updateQueries应该允许我将新元素推送到我的资产列表,而不必再次触发我的原始获取查询.
该函数被执行但该函数返回的任何内容都被完全忽略,并且不修改缓存.
即使我做这样的事情:
updateQueries: {
getUserAssets: (previousQueryResult, { mutationResult }) => {
return {};
}
}
Run Code Online (Sandbox Code Playgroud)
没有什么变化.
更新#2
仍然无法获取我的资产列表进行更新.
在里面updateQueries,这是我的previousQueryResult样子:
updateQueries: {
getUserAssets: (previousQueryResult, …Run Code Online (Sandbox Code Playgroud) javascript react-redux apollostack react-apollo apollo-client
javascript ×7
polymer ×2
react-apollo ×2
api ×1
api-design ×1
apollo ×1
apollostack ×1
couchdb ×1
iframe ×1
indexeddb ×1
json ×1
json-api ×1
jsonb ×1
oauth-2.0 ×1
polymer-1.0 ×1
postgresql ×1
pouchdb ×1
react-redux ×1
reactjs ×1
rest ×1
tags ×1