- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
// didn't add node definitions because this problem occurs on initial data fetch
// user type
const userType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: globalIdField('User'),
email: { type: GraphQLString },
posts: {
type: postConnection,
args: connectionArgs,
// getUserPosts() function is below
resolve: (user, args) => connectionFromArray(getUserPosts(user.id), args),
},
}),
interfaces: [nodeInterface],
})
// post type
const postType = new GraphQLObjectType({
name: 'Post',
fields: () => ({
id: globalIdField('Post'),
title: { type: GraphQLString },
content: { type: GraphQLString },
}),
interfaces: [nodeInterface],
})
// connection type
const {connectionType: postConnection} =
connectionDefinitions({name: 'Post', nodeType: postType})
<小时/>
// Mongoose query on other file
exports.getUserPosts = (userid) => {
return new Promise((resolve, reject) => {
Post.find({'author': userid}).exec((err, res) => {
err ? reject(err) : resolve(res)
})
})
}
<小时/>
我在浏览器控制台中收到以下警告:
<小时/>Server request for query
App
failed for the following reasons:
Cannot read property 'length' of undefined
_posts40BFVD:posts(first:10) {
^^^
这是我得到的唯一信息,没有更多错误或引用。可能是什么原因?
此代码来自relay-starter-kit ,我只用 Post
替换了所有 Widget
代码。一切都与启动器中的几乎相同,因此我认为原因在于数据库代码周围的某个地方。
但我看不到问题,因为 getUserPosts()
返回相同的结构:对象数组..
resolve: (user, args) => connectionFromArray(getUserPosts(user.id), args)
getUserPosts()
返回了一个 promise (阻止代码可能是一个坏主意),但没有回调。在我看来,发生的情况是 connectionFromArray()
继续执行代码,但它还没有从 getUserPosts()
获取数据,这导致整个系统失败。
无论如何,我使用 Babel 和 JavaScript 的“ future 功能”,因此我决定使用 async
和 await
。但仍然存在问题,getUserPosts()
返回一个空数组。
然后我发现,如果在 async
函数中使用 await
调用另一个函数,则另一个函数也必须是 async
,否则所有 await-s
都会失败。这是我最终有效的解决方案:
// async function that makes db query
exports.getUserPosts = async (userId) => {
try {
// db query
const posts = await Post.find({author: args}).exec()
return posts
} catch (err) {
return err
}
}
// and resolve method in Schema, also async
resolve: async (user, args) => {
const posts = await getUserPosts(user._id)
return connectionFromArray(posts, args)
}
我仍然不确定这是否是最好的方法。我的逻辑告诉我,我应该在 Node 中尽可能多地使用异步,但我距离 Node 专家还很远。当我了解更多信息时,我会更新这个问题。
我很高兴知道是否有更好的甚至是推荐的方法来使用 Relay 处理这种数据库查询情况。
最佳答案
问题出在 posts
字段的 resolve
函数上。
resolve: (user, args) => connectionFromArray(getUserPosts(user.id), args),
首先,getUserPosts
是一个返回 Promise 的异步函数。在编写 resolve
函数时必须考虑到这一点。其次,user.id
是由 graphql-relay
模块的 globalIdField
辅助函数为您生成的全局 ID 字段。该 ID 应转换为本地 ID。
有了继电器启动套件,您 can use 异步
和等待
。代码如下所示:
resolve: async (user, args) => {
let userId = fromGlobalId(user.id).id;
// convert this userId string to Mongo ID if needed
// userId = mongoose.Types.ObjectId(userId).
const posts = await getUserPosts(userId);
return connectionFromArray(posts, args),
},
<小时/>
在 getUserPosts
的 async
版本中,如果出现错误,则会返回 err
对象。
exports.getUserPosts = async (userId) => {
try {
// db query
const posts = await Post.find({author: args}).exec()
return posts
} catch (err) {
return err
}
}
一个好的做法是重新抛出错误或返回一个空数组。
关于relayjs - 继电器连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550035/
当您将字段定义为两种类型的联合时(例如机器包含 Ships 和 Droid),那么在 Relay 中您可以执行以下操作: fragment on Faction@ relay(plural: true
假设我有一些通过非 graphql 端点获取的数据,例如从第三方服务器(firebase)获取的数据。 如何将数据放入本地中继存储? 有没有一种简单的方法可以直接添加/编辑/覆盖数据到中继存储而无需通
我有一个共同点Header和 Footer显示它可能已经在中继存储和主要 PageComponent 中的数据需要来自“查询”的数据,但我不想向用户显示完整的加载屏幕,我想在中间显示页眉、页脚和加载屏
我的 React/Relay 应用程序中有一个表单,用于修改某些字段。我不想每次在输入中输入新字母时都发送服务器更新。如何在不总是推送到服务器的情况下使用 Relay 来支持应用程序状态?通读了大部分
我的顶级组件包括一个包含用户凭据的设置对话框。当在该对话框中进行更改并关闭对话框(状态更改为 dialogOpen=false )时,我想强制从服务器进行新的提取,因为凭据可能已更改。在 Relay
我有两个 Relay 突变,我嵌套它们以首先添加一个对象然后设置它的名称。我相信我传递给第二个突变的实际上是 Relay 获取的数据,但它似乎不同意我的观点。 React View 中的代码如下: R
// didn't add node definitions because this problem occurs on initial data fetch // user type const
我正在使用Relay Modern (兼容)。我有一个片段,其中包含一个具有一个参数的字段,但我找不到一种从父组件传递变量值的方法: // MyFragmentComponent.jsx class
看起来股票中继网络层没有随他的请求发送 cookie header 字段。所以我尝试通过添加 Cookie 字段来添加它,如下所示: Relay.injectNetworkLayer( new R
假设我有一个 React 组件,它控制一个包含博客文章内容的 textarea。当用户更改博客文章时,我使用 Mutation 更新中继存储: Relay.createContainer( Rea
https://facebook.github.io/relay/graphql/objectidentification.htm非常清楚 Node是以及它的行为方式,但它没有指定哪些对象必须实现它,
我收到以下错误。尝试通过 graphiql 运行突变时。请帮助我解决此问题或指向一个链接,我可以在其中找到 react 中继突变示例。 mutation { createUser(input: {
我想与多个 GraphQL 类型共享一个节点接口(interface)。当前出现此错误: Error: User may only implement Interface types, it cann
是否可以仅通过graphql服务器并与Relay&React结合使用来对具有不同角色的用户进行身份验证? 我环顾四周,找不到关于该主题的太多信息。 在我当前的设置中,具有不同角色的登录功能仍将通过传统
我正在构建一个包含许多不同小部件的仪表板。用户可以添加和删除任何小部件,并按照自己喜欢的任何顺序放置它们。每个小部件都有自己的数据要求。构建容器层次结构的正确 Relay 方式是什么? 为了提供一些背
假设我有一个博客: 1 个博客有很多帖子 1 个帖子有很多人点赞 1 个帖子有很多评论 1条评论有很多人点赞 在我博客的首页上,我想显示前 10 个帖子。对于每个帖子,我想显示 10 个最近的点赞者、
我目前正在做 facebook relayjs 教程,我需要帮助理解教程的这一部分,它指出 Next, let's define a node interface and type. We need
我试图在我的 React-Relay 前端中进行无限滚动分页,但没有成功。 此刻,我有这个 React 组件...... class List extends Component { state
我们有一个 graphql 服务器(不是用 javascript 编写的)服务于一个分页的对象列表。我们正在尝试符合中继规范,但我们遇到了一个有趣的案例,可以使用说明。 具体来说:是否允许游标依赖于连
我是中继新手,我正在尝试在并发模式下使用中继现代实验。我已经能够使用 Suspense 和 ErrorBoundary 很好地加载节点、边等。我现在正在处理用于创建和更新对象的表单。 我无法弄清楚如何
我是一名优秀的程序员,十分优秀!