gpt4 book ai didi

relayjs - 继电器连接错误

转载 作者:行者123 更新时间:2023-12-02 16:39:53 25 4
gpt4 key购买 nike

// 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:

  1. 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 功能”,因此我决定使用 asyncawait。但仍然存在问题,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),
},
<小时/>

getUserPostsasync 版本中,如果出现错误,则会返回 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com