- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的应用程序使用 Relay Modern,并尝试使用 updater
and optimisticUpdater
进行突变后更新缓存。但它不太有效。
基本上,我有一个带有 votes
连接的 Link
类型 - 这是我的架构的相关部分:
type Link implements Node {
createdAt: DateTime!
description: String!
id: ID!
postedBy(filter: UserFilter): User
url: String!
votes(filter: VoteFilter, orderBy: VoteOrderBy, skip: Int, after: String, before: String, first: Int, last: Int): VoteConnection
}
type Vote implements Node {
createdAt: DateTime!
id: ID!
link(filter: LinkFilter): Link!
updatedAt: DateTime!
user(filter: UserFilter): User!
}
# A connection to a list of items.
type VoteConnection {
# Information to aid in pagination.
pageInfo: PageInfo
# A list of edges.
edges: [VoteEdge]
# Count of filtered result set without considering pagination arguments
count: Int!
}
# An edge in a connection.
type VoteEdge {
# The item at the end of the edge.
node: Vote
# A cursor for use in pagination.
cursor: String
}
这是我的 Link
组件在片段中请求投票
的代码:
class Link extends Component {
render() {
const userId = localStorage.getItem(GC_USER_ID)
return (
<div>
{userId && <div onClick={() => this._voteForLink()}>▲</div>}
<div>{this.props.link.description} ({this.props.link.url})</div>
<div>{this.props.link.votes.edges.length} votes | by {this.props.link.postedBy ? this.props.link.postedBy.name : 'Unknown'} {this.props.link.createdAt}</div>
</div>
)
}
_voteForLink = () => {
const userId = localStorage.getItem(GC_USER_ID)
const linkId = this.props.link.id
CreateVoteMutation(userId, linkId, this.props.viewer.id)
}
}
export default createFragmentContainer(Link, graphql`
fragment Link_viewer on Viewer {
id
}
fragment Link_link on Link {
id
description
url
createdAt
postedBy {
id
name
}
votes(last: 1000, orderBy: createdAt_DESC) @connection(key: "Link_votes", filters: []) {
edges {
node {
id
user {
id
}
}
}
}
}
`)
最后,这是带有 updater
的 CreateVoteMutation
:
const mutation = graphql`
mutation CreateVoteMutation($input: CreateVoteInput!) {
createVote(input: $input) {
vote {
id
link {
id
}
user {
id
}
}
}
}
`
export default (userId, linkId, viewerId) => {
const variables = {
input: {
userId,
linkId,
clientMutationId: ""
},
}
commitMutation(
environment,
{
mutation,
variables,
updater: (proxyStore) => {
const createVoteField = proxyStore.getRootField('createVote')
const newVote = createVoteField.getLinkedRecord('vote')
const viewerProxy = proxyStore.get(viewerId)
const connection = ConnectionHandler.getConnection(viewerProxy, 'Link_votes')
// `connection` is undefined, so the `newVote` doesn't get inserted
if (connection) {
ConnectionHandler.insertEdgeAfter(connection, newVote)
}
},
onError: err => console.error(err),
},
)
}
对 ConnectionHandler.getConnection(viewerProxy, 'Link_votes')
的调用仅返回 undefined
,因此 newVote
实际上并未插入.
有人看出我做错了什么吗?
最佳答案
问题:
当您建立连接时:
const connection = ConnectionHandler.getConnection(viewerProxy, 'Link_votes')
您正在尝试在 ViewerProxy 上获取“Link_votes”连接。然而,您想要做的是获取链接上的连接。
解决方案:
首先,您需要获取要添加投票的链接的 ID。
const linkId = newVote.getLinkedRecord('link').getValue('id');
然后您想要获取链接代理,以便您可以获得正确的连接。
const linkProxy = proxyStore.get(LinkId)
既然您已经拥有了代表您想要连接的链接的链接代理,您现在就可以获取该连接了。
const connection = ConnectionHandler.getConnection(linkProxy, 'Link_votes')
太好了,现在您已经建立连接了。这解决了您遇到的问题。
但是还有一个问题,您继续添加投票的方式是错误的,您首先需要从中创建一条边,然后添加该边。
首先我们需要创建一条边
const voteEdge = createEdge(proxyStore, connection, newVote, 'VoteEdge');
现在我们有了 voteEdge,我们可以将其附加到连接中。
ConnectionHandler.insertEdgeAfter(connection, voteEdge)。
现在应该一切正常了。但是,您可能不应该使用更新程序功能来执行此类操作。您应该使用 RANGE_ADD 配置 https://facebook.github.io/relay/docs/mutations.html#range-add并更改您的服务器响应该突变的方式。
关于reactjs - `updater` 无法与 Relay Modern 配合使用,因为 `ConnectionHandler.getConnection()` 返回 `undefined`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737454/
我在 spring 上下文中初始化了数据源 bean。请问应该用什么方式?为什么我就是不能写 dataSource.getConnection()? 最佳答案 有一个重要区别:dataSource.g
如果我使用 DriverManager.getConnection() 和 DataSource.getConnection() 获取连接对象,当 .close() 是在那些对象上调用的? 在 .cl
在 DataSource 接口(interface)上,我发现了两种获取连接的方法,有和没有用户名和密码参数。 Connection getConnection()Connection getConn
我想对这段代码进行单元测试,以验证调用了哪个 DriverManager.getConnection() 。DriverManager.getConnection(url,user,pass) 或 D
我正在使用jsPlumb statemachine 。我想稍后保存并加载我的图表。我用谷歌搜索,发现我必须使用 json 对象来做到这一点。我尝试了几个例子stackoverflow 。我能够获得每个
如何模拟 DriverManager.getConnection() 方法? 我想测试我的方法 setUpConnectiontoDB() 我用 PowerMock、easyMock 和 Mokito
数据库连接如下所示 public Connection getDBConection(){ Context context = new InitialContext(); DataSo
我在 Java 文件中找到了这个方法,我想知道这里发生了什么?这真的有效吗?我认为这个方法什么都不做,因为 getConnection() 方法创建了一个新连接,然后它被关闭了。我说得对吗? publ
我正在尝试从nodejs中的mysql连接池获取连接。但是池的 getConnection 方法不会返回回调函数。 (因此它不会显示任何错误或返回连接)。但我的 mysql 工作台显示已建立连接。当我
我正在使用 MySQL 5.5 及其默认值。我创建了一个用户/密码并运行了一个脚本来创建一个名为员工的数据库。通过命令提示符我可以访问数据库: mysql -u user -p SELECT * FR
我有以下情况:我有一个与数据库 (MySQL) 连接的 java 代码。当我从 eclipse 运行 java 代码并从数据库中获取数据时,一切正常。但是当我从 html 代码运行 java 代码作为
我的工作电脑有一个奇怪的问题,也许你可以解决问题。我目前正在使用 jee 进行开发,我遇到了有关 MySQL DB 的问题。 假设我有这个: for(int i = 0; i<20; i++) { /
我编写了 DAO 类 public List getAllClassRooms() { List classRoomsList = new ArrayList<>(); String
在使用 BoneCP 连接池时,我遇到了以下困惑,并希望听到一些关于这方面的建议: 是 getConnection BoneCP线程安全的方法?当有许多线程请求并行连接时,使用它的最佳方法是什么? 每
最近,我们在Hive连接中添加了SSL。我们通过添加 ssl=1;sslTrustStore=C:\\keytabs\\keys.truststore;trustStorePassword=foo 到
在 SignalR 中,ITransportHeartbeat.GetConnections() 的实现应该会为我提供正在跟踪的连接列表。在我的一个案例中,我总是得到一个不再存在的网络套接字连接。 以
我正在使用jdbc连接池,如果我编写像这样的代码 DatabaseMetaData dbMeta = getConnection().getMetaData(); 其中 getConnection()
我有以下代码来测试新服务器上访问数据库的链接,一切都适用于现有服务器,并且我能够访问该文件夹。 !if.exists 返回 true,我可以使用 Runtime.getRuntime().exec("
我正在使用 Java 和 mysql 作为数据库,但遇到了一个奇怪的问题:我的一位客户的连接非常不稳定,有时丢包率可能很高。好吧,我知道这不是软件的错误,但我去那里进行了测试,当程序调用“Driver
这个问题已经有答案了: Solving a "communications link failure" with JDBC and MySQL [duplicate] (25 个回答) 已关闭 4 年
我是一名优秀的程序员,十分优秀!