Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法查询类型\“突变”上的字段\“addWorkout”

无法查询类型\“突变”上的字段\“addWorkout”
EN

Stack Overflow用户
提问于 2020-02-16 07:52:52
回答 1查看 2.8K关注 0票数 0

我对GraphQL相当陌生,我之前的问题是关于我得到的一些参考错误,但是我最终解决了,但是现在我得到了这个错误。似乎我不能添加一个锻炼,因为它不认识到它是模式中的一个突变字段。

我一直在犯错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cannot query field \"addWorkout\" on type \"Mutation\

总之,在app.js上,这是我的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express")
const app = express();
const userSchema = require("./graph-schema/userQueries")
const workoutSchema = require("./graph-schema/workoutQueries")
const mealSchema = require("./graph-schema/mealQueries")
const mongoose = require("mongoose")
const {mergeSchemas} = require("graphql-tools")

//connect to mongoDB atlase database
mongoose.connect("mongodb+srv://Zubair97:superman2008@cluster0-epauj.mongodb.net/test?retryWrites=true&w=majority")
mongoose.connection.once("open", () => {
    console.log("Connected to database")
})

const combinedSchemas = mergeSchemas({
    schemas: [
        userSchema,
        mealSchema,
        workoutSchema
    ],
})




//this module allows express to communicate with graphql ;
//we use it as a single endpoint
const graphqlHTTP = require("express-graphql")

app.use("/graphql" , graphqlHTTP({
    schema: combinedSchemas,
    graphiql: true


}))


app.listen(4000, () => {
    console.log(`Listening on port 4000`)
})

在我导出的名为workoutQueries.js的文件中定义了锻炼查询和突变,您可以看到我在解析器中定义了addWorkout。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const graphql = require("graphql")
const {WorkoutType} = require("./schema")
const Workout = require("../models/Workout.js")
const {GraphQLObjectType, GraphQLID, GraphQLString, GraphQLSchema, GraphQLInt, GraphQLList} = graphql;

const WorkoutQuery = new GraphQLObjectType({
    name: "WorkoutQuery",
    fields: () => ({
        workout: {
            type: WorkoutType,
            args: {id: {type: GraphQLID}},
            resolve(parent, args){
                //returns the workout instance from the database
                return Workout.findById(args.id)
            }

        },

        workouts: {
            type: new GraphQLList(WorkoutType),
            resolve(parent, args){
                //returns all workouts from the databse
                return Workout.find({})
            }
        }
    })

})

const WorkoutMutation = new GraphQLObjectType({
    name: "WorkoutMutation",
    addWorkout: {
        type: WorkoutType,
        args: {
            name: {type: GraphQLString},
            reps: {type: GraphQLInt},
            sets: {type: GraphQLInt},
            burnedCalories: {type: GraphQLInt},
            userId: {type: GraphQLID},

        },
        resolve(parent, args){
            let workout = new Workout({
                name: args.name,
                reps: args.reps,
                sets: args.sets,
                burnedCalories: args.burnedCalories,
                userId: args.userId
            })

            return workout.save();
        }
    },

})

module.exports = new GraphQLSchema({
    query: WorkoutQuery,
    mutation: WorkoutMutation
})

此外,即使我尝试添加一顿饭,查询和突变也会发生在一个名为mealQueries.js的文件中,我已经导出了该文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const graphql = require("graphql")
const {MealType, NutritionType} = require("./schema")
const Meal = require("../models/Meal.js")
const {GraphQLObjectType, GraphQLID, GraphQLString, GraphQLSchema, GraphQLInt, GraphQLList} = graphql;

const MealQuery = new GraphQLObjectType({
    name: "MealQueries",
    fields: () => ({
        meal: {
            type: MealType,
            args: {id: {type: GraphQLID}},
            resolve(parent, args){
                return Meal.findById(args.id)
            }
        },

        meals: {
            type: new GraphQLList(MealType),
            resolve(parent, args){
                return Meal.find({})
            }
        }

    })

})

const MealMutation = new GraphQLObjectType({
    name: "MealMutation",
    addMeal: {
        type: MealType,
        args: {
            name: {type: GraphQLString},
            servings: {type: GraphQLInt},
            calories: {type: GraphQLInt},
            nutrition: {type: NutritionType},
            userId: {type: GraphQLID}
        },
        resolve(parent, args){

            let meal = new Meal({
                userId: args.userId,
                name: args.name,
                servings: args.servings,
                calories: args.calories,
                nutrition: {
                    carbohydrates: args.nutrition.carbohydrates,
                    fats: args.nutrition.fats,
                    proteins: args.nutrition.proteins
                }
            })

            return meal.save();
        }
    }

})

module.exports = new GraphQLSchema({
    query: MealQuery,
    mutation: MealMutation
})

在创建用户和对用户进行身份验证时,我没有问题,在userQueries.js中定义的用户查询和变异是没有问题的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const graphql = require("graphql")
const User = require("../models/User.js")
const bcrypt = require("bcrypt")
const jwt = require("jsonwebtoken")
const {AuthType, UserType} = require("./schema")
const {GraphQLObjectType, GraphQLID, GraphQLString, GraphQLSchema, GraphQLInt, GraphQLList} = graphql;


const UserQuery = new GraphQLObjectType({
    name: "UserQuery",
    fields: () => ({
        user: {
            type: UserType,
            args: {id: {type: GraphQLID}},
            resolve(parent, args){
                //returns the user from the database
                return User.findById(args.id)
            }
        },
        login: {
            type: AuthType,
            args: {email: {type: GraphQLString}, password: {type: GraphQLString}},
            resolve(parent, {email, password}){
                return User.findOne({email: email}).then((user) => {
                    const isEqual = bcrypt.compare(password, user.password)
                    if (!isEqual) {
                        throw new Error('Password is incorrect!');
                    }

                    const token = jwt.sign({
                        userId: user.id,
                        email: user.email},
                        "a_super_secret",
                        {expiresIn: "1h"}
                    )

                    return {token: token, userId: user.id}


                })

            }
        }


    })


})



const UserMutation = new GraphQLObjectType({
    name: "Mutation",
    fields: {
        addUser: {
            type: UserType,
            args: {
                name: {type: GraphQLString},
                email: {type: GraphQLString},
                password: {type: GraphQLString}
            },
            async resolve(parent, args){
                const existingUser =  await User.findOne({email: args.email})
                if (!existingUser){
                    const error = new Error("User already exists");
                }

                const encryptedPassword =  await bcrypt.hash(args.password, 12)

                let user = new User({
                    name: args.name,
                    email: args.email,
                    password: encryptedPassword
                })

                const createdUser =  user.save();
                return createdUser
            }
        }



    }
})


module.exports = new GraphQLSchema({
    query: UserQuery,
    mutation: UserMutation,
})

我还在一个名为UserType、AuthType、MealType、NutritionType和WorkoutType的文件中定义了schema.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const graphql = require("graphql")
const Workout = require("../models/Workout.js")
const User = require("../models/User.js")
const Meal = require("../models/Meal")

const {GraphQLObjectType, GraphQLID, GraphQLString, GraphQLSchema, GraphQLInt, GraphQLList} = graphql;

//describes what attributes and its types, a User has in each query
const UserType = new GraphQLObjectType({
    name: "User",
    fields: () => ({
        id: {type: GraphQLID},
        name: {type: GraphQLString},
        email: {type: GraphQLString},
        password: {type: GraphQLString},
        workouts: {
            type: new GraphQLList(WorkoutType),
            resolve(parent, args){
                //returns all the workouts created by a user
                return Workout.findById({userId: parent.id})
            }
        },
        meals: {
            type: new GraphQLList(MealType),
            resolve(parent, args){
                //returns all the meals created by a user
                return Meal.findById({userId: parent.id})
            }
        }

    })
})

const NutritionType = new GraphQLObjectType({
    name: "Nutrition",
    fields: () => ({
        carbohydrates: {type: GraphQLInt},
        fats: {type: GraphQLInt},
        proteins: {type: GraphQLInt}
    })
})



const WorkoutType = new GraphQLObjectType({
    name: "Workout",
    fields: () => ({
        id: {type: GraphQLID},
        name: {type: GraphQLString},
        reps: {type: GraphQLInt},
        burnedCalories: {type: GraphQLInt},
        sets: {type: GraphQLInt},
        user: {
            type: UserType,
            resolve(parent, args){
                //returns the user from the database that created the workout instance
                return User.findById(parent.userId)

            }
        }

    })
})




const AuthType = new GraphQLObjectType({
    name: "Authentication",
    fields: () => ({
        token: {type: GraphQLString},
        userId: {type: GraphQLString}
    })
})



const MealType = new GraphQLObjectType({
    name: "Meal",
    fields: () => ({
        id: {type: GraphQLID},
        calories: {type: GraphQLInt},
        servings: {type: GraphQLInt},
        nutrition: {type: NutritionType},
        user: {
            type: UserType,
            resolve(parent, args){
                //returns the user from the database that created the meal instance
                return User.findById(parent.userId)
            }
        }

    })
})




module.exports = {
    AuthType,
    WorkoutType,
    UserType,
    MealType,
    NutritionType
}

我怀疑我所得到的错误是由于来自graphql工具的mergeSchema对象,也许它不能正确地合并GraphQLSchema类型?我不确定。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2020-02-16 09:11:52

mergeSchemas打算与模式拼接一起使用。它不应该仅仅用于模块化您的单个模式,这正是您在这里要做的。

您应该只创建单个GraphQLSchema对象,为查询根类型创建单个GraphQLObjectType,为突变根类型创建单个GraphQLObjectType。如果希望将特定类型的字段(如Mutation类型)分散到多个模块中,则应该导出--仅是这些字段--,而不是整个类型或模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  queries: {
    workout: { ... },
    workouts: { ... },
  },
  mutations: {
    addWorkout: { ... },
  },
}

无论您在什么文件中创建模式,都可以从多个模块导入这些字段,并将它们组合成一个单独的模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const query = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    ...require('moduleA').queries,
    ...require('moduleB').queries,
    ...require('moduleC').queries,
  }),
})
const mutation = new GraphQLObjectType({ ... })
const schema = new GraphQLSchema({ query, mutation })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60250277

复制
相关文章
Sqlserver查询数据表中的字段类型
select a.name 表名, b.name 字段名, case c.name when 'numeric' then 'numeric(' + convert(varchar,b.length) + ',' + convert(varchar,b.xscale) + ')' when 'char' then 'char(' + convert(varchar,b.length) + ')' when 'varchar' then 'varchar(' + convert(varchar,b.l
静谧的小码农
2019/04/25
4.2K0
Sqlserver查询数据表中的字段类型
MongoDB查询时排序字段为int类型和string类型的区别
平常用Mysql比较多所以在查询时自然想到ORDER BY list_order DESC,
solate
2019/07/22
1.9K0
基因突变类型
突变是指发生在遗传物质上的变异。广义上突变可以分为两类:染色体变异(chromosome aberration),即染色体数目和结构的改变;基因突变(genemutation),即基因的核苷酸顺序或数目发生改变。狭义突变通常特指基因突变,它包括单个碱基改变所引起的点突变(point mutation),或多个碱基的缺失、重复和插入。
生信交流平台
2022/09/21
1.4K0
基因突变类型
MySQL的字段类型_mysql数据库字段类型
要了解一个数据库,我们必须了解其支持的数据类型。MySQL 支持大量的字段类型,其中常用的也有很多。前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇文章我们将把字段类型一网打尽,讲一讲常用字段类型的用法。
全栈程序员站长
2022/10/04
19.5K0
MySQL的字段类型_mysql数据库字段类型
mysql float字段类型数据查询为空问题
作者:matrix 被围观: 224 次 发布时间:2021-12-28 分类:mysql PHP | 无评论 »
HHTjim 部落格
2022/09/26
5.2K0
mysql密码字段类型_MySQL 字段类型
MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。
全栈程序员站长
2022/11/17
14.5K0
mysql密码字段类型_MySQL 字段类型
mysql longtext_MySql中LongText类型大字段查询优化
在本次项目表结构中,有一个longtext字段,用于存储长文本,仅万条数据,InnoDB存储文件就达G级,由于是一个小项目,受限于服务器与运维人员水平,不适合使用hdfs,MongoDB等拓展技术栈来解决这种问题,因此直接对mysql存储进行优化,快速解决,利于维护。
全栈程序员站长
2022/08/28
3.9K0
mongovue查询字段_mongodb查询速度
{“ei”:”AW4BROILANDSTART1″, //条件一 “cd”:{$elemMatch:{“0004”:{$gte:0}}},  //条件二,cd为集合 ,0004为集合中的key
全栈程序员站长
2022/09/25
2.4K0
MySQL字段类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
全栈程序员站长
2022/08/04
9.4K0
blob类型字段[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/16
2.9K0
临床相关突变查询数据库
越来越多的研究发现某一个基因的突变和很多的临床特征有关系。如果我们想有查找临床性状和基因突变的关系的话,内容比较全面的就是ClinVar数据库了。ClinVar 数据库是ncbi旗下用于查看临床相关突变的数据库。但是其数据库的内容比较多,而且检索界面不是很友好。所以经常看不懂其结果。所以今天就介绍一个检索简单的突变和表型的数据库。Simple ClinVar(http://simple-clinvar.broadinstitute.org/)。通过其名字我们就知道这个是一个简易版的Clinvar数据库。
医学数据库百科
2021/11/18
1K0
临床相关突变查询数据库
MongoDB-使用$type查询某个字段的类型是否为xxx
有朋友问我最近为什么都一直在更新mongodb的相关操作教程呢?因为呀,我目前的工作中需要用到呀。
小博测试成长之路
2022/12/02
1.5K0
MongoDB-使用$type查询某个字段的类型是否为xxx
oracle查看表字段类型_oracle更改表字段类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/03
1.1K0
Mysql 字段常用字段类型
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!
收心
2022/01/25
7.9K0
MySQL字段类型的详细解释
MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。 概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。 由MySQL支持的列类型列在下面。下列代码字母用于描述中:M指出最大的显示尺寸。最大的合法的显示尺寸是 255 。 D适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。 方括号(“[”和“]”)指出可选的类型修饰符的部分。注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。 TINYINT[(M)] [UNSIGNED] [ZEROFILL] 一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。 SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。 MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。 INT[(M)] [UNSIGNED] [ZEROFILL] 一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。 INTEGER[(M)] [UNSIGNED] [ZEROFILL] 这是INT的一个同义词。 BIGINT[(M)] [UNSIGNED] [ZEROFILL] 一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到 18446744073709551615。注意,所有算术运算用有符号的BIGINT或DOUBLE值完成, 因此你不应该使用大于9223372036854775807(63位)的有符号大整数,除了位函数!注意, 当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数), 如果结果大于9223372036854775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数, 其精度可以是<=24,对一个双精度浮点数,是在25 和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。 FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数位数是未定义的。在MySQL3.23中, 这是一个真正的浮点值。 在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。 FLOAT[(M,D)] [ZEROFILL] 一个小(单精密)浮点数字。 不能无符号。 允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。 M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。 DOUBLE[(M,D)] [ZEROFILL] 一个正常大小(双精密)浮点数字。 不能无符号。 允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。 M是显示宽度而D是小数位数。 没有一个参数的 DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。 DOUBLE PRECISION[(M,D)] [ZEROFILL] REAL[(M,D)] [ZEROFILL] 这些是DOUBLE同义词。 DECIMAL[(M[,D])] [ZEROFILL] 一个未压缩(unpack)的浮点数字。 不能无符号。 行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。 小数点,并且对于负数,“-”符号不在M中计算。 如果D是0,值将没有小数点或小数部分。 DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的 DECIMAL列, 实际的范围可以通过M和D的选择被限制。 如果D被省略,它被设置为0。如果M被省掉,它被设置为10。 注意,在MySQL3.22 里,M参数包括符号和小数点。 NUMERIC(M,D) [ZEROFILL] 这是DECIMAL的一个同义词。 DATE 一个日期。支持的范围是'1000-01-01'到'9999-12-31'。 MySQL以'YYYY-MM-DD'格式来显示DATE值, 但是允许你使用字
用户9076598
2022/03/02
2.3K0
ElasticSearch(7.2.2)-常⻅的字段类型
数据类型 核⼼数据类型 复杂数据类型 专⽤数据类型 核⼼数据类型 字符串 text:⽤于全⽂索引,该类型的字段将通过分词器进⾏分词 keyword:不分词,只能搜索该字段的完整的值 数值型 long, integer, short, byte, double, float, half_float, scaled_float 布尔 - boolean ⼆进制 - binary:该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索 范围类型 范围类型表示值是⼀个范围,⽽不是⼀个具体
cwl_java
2019/11/04
8690
mysql alter 修改字段类型_Mysql必读mysql 增加修改字段类型及删除字段类型「建议收藏」
本文介绍了MysqL必读MysqL 增加修改字段类型及删除字段类型,希望对您有用。如果有疑问,可以联系我们。
全栈程序员站长
2022/09/01
10.2K0
ElasticSearch的Mapping之字段类型
es支持大多数java里面的数据类型: (一)核心数据类型: (1)string: 默认会被分词,一个完整示例如下 Java代码 "status": { "type": "string", //字符串类型 "index": "analyzed"//分词,不分词是:not_analyzed ,设置成no,字段将不会被索引 "analyzer":"ik"//指定分词器 "boost":1.23//字段级别的分数加权
我是攻城师
2018/05/14
1.7K0
PostgreSQL查询数据库表以及每一个表里面的字段的类型,字段名称,字段意思
目录 1 查看特定表名备注 2 查看全部表名和备注 3 查询全部都表名 4 查看特定表名字段,字段类型,描述 5 查询所有表名称以及字段含义 1 查看特定表名备注 select relname as tabname, cast(obj_description(relfilenode,'pg_class') as varchar) as comment from pg_class c where relname ='user'; 2 查看全部表名和备注 就是查看public 下的全部都表名称 select
一写代码就开心
2022/10/04
3.1K0
mysql varchar类型字段为数字时,不带引号查询时查询结果与事实不符
今天出现了一个bug,在数据库中我们将订单表中的order_no从之前的bigint(20)改成varchar(20)后,原有的代码逻辑在进行时查询时,之前是以Long类型传参查询的。
翎野君
2023/05/12
1.6K0
mysql varchar类型字段为数字时,不带引号查询时查询结果与事实不符

相似问题

错误:[{消息:“无法查询字段"...”类型“突变”。您的意思是“...”吗?“,…}]

124

“突变”类型的字段上的未知参数

111

无法在“查询”类型上查询字段"allMdx“

11

无法在查询类型上注册查询字段

11

无法查询类型"y“上的字段"x”

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文