我现在正在玩GraphQL-JS,将其连接到MariaDB后端。
我想出了如何返回整个结果集:
const queryType = new GraphQLObjectType({
name: 'Query',
fields: () => ({
users: {
type: new GraphQLList(userType),
resolve: (root, args) => new Promise((resolve, reject) => {
db.query('select * from users', (err, rows, fields) => {
if(err) return reject(err);
resolve(rows);
});
}),
}
})
});
Run Code Online (Sandbox Code Playgroud)
GraphQL是否有任何便利措施?
据我所知,GraphQLList期望有一个完整的数组,而且我只能解析一次结果集,不能使用Emitter或其他东西进行输入。
我正在尝试使用与Relay兼容的GraphQL架构设置node.js服务器.
尝试验证或加载架构时,我收到以下错误:
EventEdge.node field type must be Output Type but got: undefined.
这是由于在其他类型定义之一中为Event类型提供了连接类型.
我不会发布整个架构,因为它非常详细,但是当连接字段被注释掉时,架构被正确加载并且不会抛出任何错误.
我已经包含了导致相同问题的简化模式的示例:
const graphql = require('graphql')
const relay = require('graphql-relay')
const GraphQLID = graphql.GraphQLID,
GraphQLInt = graphql.GraphQLInt,
GraphQLString = graphql.GraphQLString,
GraphQLList = graphql.GraphQLList,
GraphQLObjectType = graphql.GraphQLObjectType,
GraphQLSchema = graphql.GraphQLSchema,
GraphQLNonNull = graphql.GraphQLNonNull
const connectionArgs = relay.connectionArgs,
connectionDefinitions = relay.connectionDefinitions,
connectionFromArray = relay.connectionFromArray,
cursorForObjectInConnection = relay.cursorForObjectInConnection,
fromGlobalId = relay.fromGlobalId,
globalIdField = relay.globalIdField,
mutationWithClientMutationId = relay.mutationWithClientMutationId,
nodeDefinitions = relay.nodeDefinitions,
toGlobalId = relay.toGlobalId
// Models (ORM Mappings)
const models = …Run Code Online (Sandbox Code Playgroud) 我已经设置了一个graphql模式,其中一个字段('items')是一个Union类型的对象列表,即列表项可以是两个对象类型之一(在这种情况下,它们被称为'packageOfferItem'和' tileItem').
var searchResultItemType = new graphql.GraphQLUnionType({
name: 'SearchResultItems',
types: [ packageOfferItem, tileItem ],
resolveType: function (value) {
if (value.type === 'packageOffer') {
return packageOfferItem;
} else if (value.type === 'tile') {
return tileItem;
} else {
return null;
}
}
});
var searchResultItemsType = new graphql.GraphQLList(searchResultItemType);
Run Code Online (Sandbox Code Playgroud)
items然后该字段是类型searchResultItemsType.
在我的测试中,我有一个查询,items使用表示法从文件中请求数据 :
{
items {
...on packageOfferItem {
id
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中我得到一个错误 [Error: Unknown type "packageOfferItem".] message: 'Unknown type "packageOfferItem".' } ]
这个错误来自哪里?packageOfferItem是graphql NamedType …
我试图执行这样的查询:
{
people{
pet{
name
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
{
"people": {
"pet": null
}
},
{
"people": {
"pet": {
name: "steve"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是只让包含宠物的人,有什么办法可以做到这一点,而不是在我的解析器上编码?
为什么我从架构文件中收到此错误?
错误:
graphql/jsutils/invariant.js:19
throw new Error(message);
^
Error: Entity fields must be an object with field names as keys or a function which returns such an object.
Run Code Online (Sandbox Code Playgroud)
错误围绕着entity支柱PersonType。msg指示上的每个字段Entity都应该是一个对象,但是我在任何地方都没有看到这样的示例。
基本上,我试图基于Person查询返回的值从DuckDuckGo API中获取一些数据。从API返回的数据是一个具有许多属性的对象,我试图使用其中的两个来entity在我的对象上填充一个Person对象。
我看过类型系统文档,但看不到答案。http://graphql.org/docs/api-reference-type-system/
这是在Node上运行并提供给GraphiQL UI的代码。
任何建议,将不胜感激!谢谢。
码:
const PersonType = new GraphQLObjectType({
name: 'Person',
description: '...',
fields: () => ({
name: {
type: GraphQLString,
resolve: (person) => person.name
},
url: {
type: GraphQLString,
resolve: (person) => person.url
},
films: {
type: …Run Code Online (Sandbox Code Playgroud) 如何表示可以是简单ObjectId字符串或填充对象实体的字段?
我有一个表示'设备类型'的Mongoose Schema,如下所示
// assetSchema.js
import * as mongoose from 'mongoose'
const Schema = mongoose.Schema;
var Asset = new Schema({ name : String,
linked_device: { type: Schema.Types.ObjectId,
ref: 'Asset'})
export AssetSchema = mongoose.model('Asset', Asset);
Run Code Online (Sandbox Code Playgroud)
我试图将其建模为GraphQLObjectType,但我很难理解如何允许linked_ue字段采用两种类型的值,一种是一种ObjectId,另一种是完整的Asset对象(当它被填充时)
// graphql-asset-type.js
import { GraphQLObjectType, GraphQLString } from 'graphql'
export var GQAssetType = new GraphQLObjectType({
name: 'Asset',
fields: () => ({
name: GraphQLString,
linked_device: ____________ // stumped by this
});
Run Code Online (Sandbox Code Playgroud)
我已经研究了联盟类型,但问题是联盟类型期望字段被规定为其定义的一部分,而在上述情况下,linked_device当linked_device对应于简单时,字段下面没有字段ObjectId. …
我有一个使用GraphQL的标准快递服务器
const server = express();
server.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));
Run Code Online (Sandbox Code Playgroud)
问题是:如何访问request解析器内的对象?我想在一些特定的查询中检查JWT
这是导入的架构:
const typeDefs = `
type User {
id: String,
name: String,
role: Int
}
type Query {
user(id: String): User,
users: [User]
}
`;
const resolvers = {
Query: {
user: (_, args, context, info) => users.find(u => u.id === args.id),
users: (_, args, context, info) => users
}
}
module.exports = makeExecutableSchema({typeDefs, resolvers});
Run Code Online (Sandbox Code Playgroud) 我才刚刚开始使用GraphQL,我想要一个使用磁盘上的JSON文件作为数据源的解析器。到目前为止,我所得到的使GraphQL返回null。
我该怎么做?为什么下面的方法不起作用?
var schema = buildSchema(`
type Experiment {
id: String
trainData: String
goldData: String
gitCommit: String
employee: String
datetime: String
}
type Query {
# Metadata for an individual experiment
experiment: Experiment
}
schema {
query: Query
}`);
var root = {
experiment: () => {
fs.readFile('./data/experimentExample.json', 'utf8', function(err, data) {
if (err) throw err;
console.log(data);
return JSON.parse(data);
});
}
};
const app = express();
app.use('/graphql', graphqlHTTP({
rootValue: root,
schema: schema,
graphiql: true
}));
app.listen(4000);
console.log('Running a …Run Code Online (Sandbox Code Playgroud) 我目前有多个运行Apollo的GraphQL服务,并创建了一个使用远程模式拼接的"网关"服务,以便为我提供一个访问端点.
在我的网关服务中,我希望扩展远程类型以在拼接模式之间创建引用.
const linkTypeDefs = `
extend type User {
profile: Profile
}
extend type Profile {
user: User
}`;
const schema = mergeSchemas({
schemas: [userSchema, profileSchema, linkTypeDefs],
resolvers: /* Resolvers */
});
Run Code Online (Sandbox Code Playgroud)
但是我似乎得到以下错误:
GraphQLError:无法扩展"User"类型,因为它在现有模式中不存在.
我已经进行了双重检查,并且存在"用户"和"配置文件"类型,我可以从Gateway Graphiql查询它们.
为了扩展从远程模式合并的类型,是否需要采取任何特定步骤?
我有一个graphql/ apollo-server/ graphql-yoga端点。该端点公开从数据库(或REST端点或其他服务)返回的数据。
我知道我的数据源正在返回正确的数据-如果将调用结果记录到解析器中的数据源,则可以看到正在返回的数据。但是,我的GraphQL字段始终解析为null。
如果我将字段设为非空,则errors在响应中的数组内部会看到以下错误:
无法为不可为空的字段返回null
为什么GraphQL不返回数据?
graphql-js ×10
graphql ×9
node.js ×4
javascript ×3
express ×2
apollo ×1
json ×1
meteor ×1
mongodb ×1
mongoose ×1
passport.js ×1
react-apollo ×1
relayjs ×1
streaming ×1