假设我正在尝试将自行车创建为突变
var createBike = (wheelSize) => {
if (!factoryHasEnoughMetal(wheelSize)) {
return supplierError('Not enough metal');
}
return factoryBuild(wheelSize);
}
Run Code Online (Sandbox Code Playgroud)
当没有足够的钢材用于闪亮的车轮时会发生什么?我们可能需要客户端的错误.如何通过以下突变从我的graphQL服务器获取它们:
// Mutations
mutation: new graphql.GraphQLObjectType({
name: 'BikeMutation',
fields: () => ({
createBike: {
type: bikeType,
args: {
wheelSize: {
description: 'Wheel size',
type: new graphql.GraphQLNonNull(graphql.Int)
},
},
resolve: (_, args) => createBike(args.wheelSize)
}
})
})
Run Code Online (Sandbox Code Playgroud)
是否像返回服务器/我定义的错误类型一样简单?
我正在尝试查询一个 graphQL 端点,但我无法弄清楚我做错了什么。我应该如何设置要传递的 graphQL 对象。如果我想通过
{
name {
age
}
}
Run Code Online (Sandbox Code Playgroud)
我应该如何包装它以从服务器获得正确的响应?我目前正在使用的完整代码如下
var http = require('http')
var qs = require('querystring')
var options = {
hostname: 'url',
method: 'POST',
path: '/query'
}
var req = http.request(options, function(res){
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
res.on('end', function() {
console.log('No more data in response.')
})
})
var query = qs.stringify({data: {classes:{}}})
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.write(query)
req.end()
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 …
我的直接问题是为什么不调用查询解析函数?
我怀疑是变异解析函数(有效)的返回值存在问题。那么,返回值应该是什么样的呢?
更高层次的问题是:GraphQL 中是否有一种标准的方式来注册新用户并处理用户已经存在的情况?
下面的方法是将用户的所有数据都放在会话数据中,只传回前端需要的数据。
/**
* graphQL.js
*
* Created by jrootham on 18/04/16.
*
* Copyright © 2016 Jim Rootham
*/
import graphqlHTTP from "express-graphql";
import {
graphql,
GraphQLSchema,
GraphQLObjectType,
GraphQLString,
GraphQLNonNull,
GraphQLBoolean
} from 'graphql';
import {hash} from "bcrypt"
import {connect, User} from "../database/defineDB";
const GraphUser = new GraphQLObjectType({
name: "GraphUser",
description: "A user object",
fields: () => {
return {
name: {
type: GraphQLString,
resolve: (_, __, session) => {
console.log("resolve name", session);
let name = …Run Code Online (Sandbox Code Playgroud) 我将从 CMS 获得 JSON,并使用 JSON 我希望能够以编程方式编写 graphQl 模式。无需直接写入字符串。
是否有任何 JavaScript 工具可以做到这一点?
我指的是 buildSchema 函数的字符串参数:
我正在努力在 node.js 中设置一个 graphQL 模式。该/graphql终端通常会与传递的参数(S)击中。例如,一个 API 调用可能正在寻找“检查”帐户:
query {
accounts(type: "checking") {
id
type
country
currency
}
}
Run Code Online (Sandbox Code Playgroud)
另一个可能正在寻找“美国”的所有帐户:
query {
accounts(country: "US") {
id
type
country
currency
}
}
Run Code Online (Sandbox Code Playgroud)
...还有一个可能正在寻找以“英镑”计价的“英国”中的“储蓄”账户:
query {
accounts(type: "savings", country: "UK", currency: "GBP") {
id
type
country
currency
}
}
Run Code Online (Sandbox Code Playgroud)
是否选择了正确的方法定义此查询作为可选项的参数type,country和currency?
我有以下 GraphQLEnumType
const PackagingUnitType = new GraphQLEnumType({
name: 'PackagingUnit',
description: '',
values: {
Carton: { value: 'Carton' },
Stack: { value: 'Stack' },
},
});
Run Code Online (Sandbox Code Playgroud)
在突变查询中,如果我将 PackagingUnit 值作为 Carton(不带引号)传递,它会起作用。但是如果我作为字符串 'Carton' 传递,它会抛出以下错误
In field "packagingUnit": Expected type "PackagingUnit", found "Carton"
Run Code Online (Sandbox Code Playgroud)
有没有办法从客户端将枚举作为字符串传递?
编辑:我的前端有一个表单,我从用户那里收集 PackagingUnit 类型以及其他字段。PackagingUnit 类型在前端表示为字符串(不是 graphQL Enum 类型),由于我没有使用 Apollo Client 或 Relay,所以我必须自己构建 graphQL 查询字符串。现在我正在收集表单数据作为 JSON,然后执行 JSON.stringify(),然后删除属性上的双引号以获得最终的 graphQL 兼容查询。
例如。我的表单有两个字段 PackagingUnitType (An GraphQLEnumType) 和 noOfUnits (An GraphQLFloat) 我的 json 结构是
{
packagingUnitType: "Carton",
noOfUnits: 10
}
Run Code Online (Sandbox Code Playgroud)
使用 JSON.stringify() 将其转换为字符串
'{"packagingUnitType":"Carton","noOfUnits":10}'
Run Code Online (Sandbox Code Playgroud)
然后删除属性上的双引号
{packagingUnitType:"Carton",noOfUnits:10} …Run Code Online (Sandbox Code Playgroud) 在graphql.js 中如何从mysql db 表中获取最后3 个created_at 元素?我使用 sequelize.js
像这样:
query: '{
elements(last:3){
id
}
}'
Run Code Online (Sandbox Code Playgroud)
这是我的文件 db.js
const Conn = new Sequelize(/*connection config*/);
Conn.define('elements', {
id: {
type: Sequelize.STRING(36),
primaryKey: true,
allowNull: false
}
});
export default Conn;
Run Code Online (Sandbox Code Playgroud)
这是我的文件 schema.js
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields() {
return {
elements: {
type: new GraphQLList(Element),
args: {
id: {
type: GraphQLString
}
},
resolve (root, args) {
return Db.models.elements.findAll({ where: args });
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 问题是关于突变,乐观响应和watchQuery的交互.
我有一个突变"myMutation",它有一个"optimisticResponse"和一个实现的"更新"功能.
每次我进行变异查询时,"update"函数被调用两次,第一次使用乐观响应数据,第二次使用实际数据.一切都很好,所有这些都在文档中描述.
在我的"更新"功能中,我通过使用readQuery/writeQuery方法修改"myQuery"缓存数据.
每次我修改"myQuery"缓存数据时,都会调用watchQuery(基于"myQuery")订阅.一切都很好,所有这些都在文档中描述.
但问题是我无法区分我的watchQuery是否收到乐观的响应数据或真实的响应数据.这对我来说至关重要,因为反应必须不同,因为有价值的数据部分只能由服务器提供.当我收到乐观的响应时,我应该显示一个具有特殊风格的GUI元素,我应该禁止与它进行任何交互,直到我收到真实的响应.
不幸的是,我无法解决这个问题.乍看之下,乐观和真实反应之间没有区别.我已经google了很多,并没有找到解决方案.我唯一的想法是在我的GraphQL数据中添加一个特殊字段,该字段将显示是否从服务器收到响应.但它看起来很难看,闻起来很糟糕.我相信,必须有一个简单的正确方法来克服这个问题.
我使用mongoose,typescript并graphql构建我的应用。
我是全栈开发人员。
问题是我定义字段类型的模型FIVE倍。
服务器端:
models/book.ts:
// first time
interface IBook extends mongoose.Document {
title: string;
author: string;
}
// second time
const bookSchema = new mongoose.Schema({
title: String,
author: String
})
const Book: mongoose.Model<IBook> = mongoose.model<IBook>('Book', bookSchema)
Run Code Online (Sandbox Code Playgroud)
graphql/typeDefs.ts
const typeDefs = `
// third time
type Book {
title: String!
author: String!
}
// fourth time
input BookInput {
title: String!
author: String!
}
`
Run Code Online (Sandbox Code Playgroud)
客户端:
interfaces/book.ts
// fifth time
interface …Run Code Online (Sandbox Code Playgroud)