我正在尝试查询一个 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 中是否有一种标准的方式来注册新用户并处理用户已经存在的情况?
下面的方法是将用户的所有数据都放在会话数据中,只传回前端需要的数据。
/**
* 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) 我做了这个样本:https://github.com/Akryum/vueconf-2017-demo
因此,我的项目中有相同的文件:https://github.com/Akryum/vueconf-2017-demo/blob/master/src/apollo-client.js
这是我的应用程序中使用的代码:
import { ApolloClient, createNetworkInterface } from 'apollo-client'
const apolloClient = new ApolloClient({
networkInterface: createNetworkInterface({
uri: 'http://localhost:3000/graphql',
transportBatching: true,
}),
connectToDevTools: true,
})
export default apolloClient
Run Code Online (Sandbox Code Playgroud)
结果,我得到控制台的错误(警告):
warning in ./src/apollo/client.js
15:23-45 "export 'createNetworkInterface' was not found in 'apollo-client'
Run Code Online (Sandbox Code Playgroud)
这是来自浏览器控制台:
TypeError: Object(__WEBPACK_IMPORTED_MODULE_0_apollo_client__["createNetworkInterface"]) is not a function. (In 'Object(__WEBPACK_IMPORTED_MODULE_0_apollo_client__["createNetworkInterface"])({
uri: 'http://localhost:3000/graphql',
transportBatching: true
})', 'Object(__WEBPACK_IMPORTED_MODULE_0_apollo_client__["createNetworkInterface"])' is an instance of Object)
Run Code Online (Sandbox Code Playgroud)
问题是什么?
我是GraphQL的新手。我正在使用Amazon和Itunes的API来获取书名(和其他信息)。我正在返回这样的对象:
var data = [];
data.title = results[0].title;
data.author = results[0].author;
return data;
Run Code Online (Sandbox Code Playgroud)
我可以调用Amazon和Itunes API并返回一本书的可用数据。但是,我希望能够插入EAN / ISBN数组,并从Amazon和Itunes返回所有书籍的数据。
因此查询将变成这样:
{
book(id:["9789025451608", "8974832789431","9789024576791"]){
amazon{
title
},
itunes{
title
}
}
}
Run Code Online (Sandbox Code Playgroud)
以及响应:
{
"data": {
"book": {
"book1":{
"amazon": {
"title": "De Moord op Commendatore"
},
"itunes": {
"title": "Niet beschikbaar" // not available
}
},
"book2":{
"amazon": {
"title": "Origin"
},
"itunes": {
"title": "Origin"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经搜索了使用graphQLList的示例,但是我不确定在哪里使用graphQLList以及如何遍历BookTypes。
也许有人可以帮助我或给我一个例子。
我的查询看起来像这样
{
book(id:["9789025451608"]){
amazon{
title
},
itunes{
title
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 apollo graphql 服务器。我有一个查询,无序运行良好。
query feedQuery {
allPostsFromAllBlogs
{
id
blogId
title
text
likes
createdAt
}
}
Run Code Online (Sandbox Code Playgroud)
我想对结果进行排序(类型为 [Post])。这是我用来执行此操作的查询:
query feedQuery {
allPostsFromAllBlogs( orderBy: {field: createdAt, direction:DESC})
{
id
blogId
title
text
likes
createdAt
}
}
Run Code Online (Sandbox Code Playgroud)
在graphiql中产生这个输出:
{
"errors": [
{
"message": "Unknown argument \"orderBy\" on field \"allPostsFromAllBlogs\" of type \"Query\".",
"locations": [
{
"line": 2,
"column": 25
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是架构:
scalar DateTime
type Query {
blogInfo(id: String): Blog
post(id: String): Post
topPost(blogId: String): Post
allPosts(blogId: String): …Run Code Online (Sandbox Code Playgroud) 我们在SDL中定义了一堆枚举类型,它们非常适合查询和变异。在“解析器”部分中,这些映射到代表后端中那些枚举的字符串。
例如,在SDL中,我们有:
enum WRRole {
USER
PROVIDER
SUPPORT
ADMIN
SUPER_ADMIN
GUEST
}
Run Code Online (Sandbox Code Playgroud)
在解析器部分,我们有:
WRRole: {
USER: 'user',
PROVIDER: 'provider',
SUPPORT: 'support',
ADMIN: 'admin',
SUPER_ADMIN: 'super admin',
GUEST: 'guest'
},
Run Code Online (Sandbox Code Playgroud)
解析器使用Mongoose匹配在nodejs后端中定义的枚举值,其中该字段定义为:
...
roles: {
type: [
{
type: String,
enum: ['user', 'provider', 'support', 'admin', 'super admin', 'guest']
}
],
default: ['user']
},
...
Run Code Online (Sandbox Code Playgroud)
GraphQL枚举存在的问题是,我们无法对枚举进行自省,也无法使用GraphQL自省来获取映射。
这会导致构建UI时出现问题,我们希望在其中向用户提供这些选项的下拉列表。SDL枚举值(例如SUPER_USER)非常适合这些键,但我们希望显示实际的后端映射值以供选择。
这只是我们拥有的许多枚举的一个例子。许多映射值由多个单词组成,这些单词之间有空格,或者包含SDL枚举值中不允许使用的字符(例如“ super admin”)。
所以我的问题是...你们所有人如何处理这样的事情而不必重复自己或在前端添加更多代码以将它们映射为更有用的有意义的名称以进行展示?
无法保证顺序与后端中枚举的已定义顺序匹配,因此,即使解析器知道这一点,将枚举添加到后端模型中也会严重混淆SUPER_USER实际上映射到“超级用户”的所有假设。
问候
史蒂夫
graphql-js ×10
graphql ×9
apollo ×2
javascript ×2
arrays ×1
enums ×1
express ×1
list ×1
node.js ×1
sequelize.js ×1
vue-apollo ×1