Mutations
定义修改mutation
其实和定义查询Query
是类似的
Query
const schema = buildSchema(`
type Account { //
name: String
age: Int
gender: String
department: String
}
type Query {
hello: String
account: Account //
}
`)
Mutation
const schema = buildSchema(`
input AccountInput { //
name: String
age: Int
gender: String
department: String
salary: Int
}
type Account {
name: String
age: Int
gender: String
department: String
salary: Int
}
type Mutation {
createAccount(input: AccountInput): Account
}
`)
在type Mutation
中:
- 定义
createAccount
方法的形参(input: AccountInput)
,其中形参input
的类型为AccountInput
,这个AccountInput
类型的定义和之前在query中定义类型的方法是类似的,不同的是,这个类型在定义的时候用的是input
,也就是input AccountInput{}
,而不是和查询中定义一样用的是query
- 定义
createAccount
方法的返回类型Account
,因为基本来说返回值最后都是通过Query
得到的,所以这里的Account
的定义还是通过query的方式来进行,也就是前面应该是type
const express = require('express');
const {
buildSchema
} = require('graphql');
const {
graphqlHTTP
} = require('express-graphql');
// 定义schema,查询和类型
const schema = buildSchema(`
input AccountInput {
name: String
age: Int
gender: String
department: String
}
type Account {
name: String
age: Int
gender: String
department: String
}
type Mutation {
createAccount(input: AccountInput): Account
updateAccount(id: ID, input: AccountInput): Account
}
`)
// 定义一个假的数据库
const fakeDb = {};
// 定义查询对应的解析器
const root = {
// 这里的input相当于拿到的所有字段
createAccount({ input }){
// 相当于数据库的保存
fakeDb[input.name] = input;
// 返回保存的结果
return fakeDb[input.name];
},
updateAccount({ id, input }){
// 相当于数据库的更新
// 从fakeDb中拿到需要的fakeDb[id],拿到之后将input新的属性覆盖到它身上
const updatedAccount = Object.assign({}, fakeDb[id], input);
// 将更新保存到数据库
fakeDb[id] = updatedAccount;
// 返回更新的结果
return updatedAccount;
}
}
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true
}));
app.listen(9000, () => {
console.log("http://localhost:9000/graphql")
});
node mutationtest_1.js
之后,发现在http://localhost:9000/graphql发现error👇

这是为什么呢???
⚠️ 这是因为graphql中必须要有一个query,也就是说你不能只往里面写,你必须要与一个读的操作
所以就需要添加一个关于查询的Query
了
// 添加到schema
type Query {
accounts: [Account]
}
// 添加到root
accounts(){
return fakeDb;
}
然后运行

存入之后进行query时,发现还在报错👇

这个错的原因是因为返回的值不是一个数组,所以这块需要将root
下面的acounts
下面return fakeDb
修改一下,因为可以在代码中看到这块的fakeDb是一个对象,所以下面需要改一下
const express = require('express');
const {
buildSchema
} = require('graphql');
const {
graphqlHTTP
} = require('express-graphql');
// 定义schema,查询和类型
const schema = buildSchema(`
input AccountInput {
name: String
age: Int
gender: String
department: String
}
type Account {
name: String
age: Int
gender: String
department: String
}
type Mutation {
createAccount(input: AccountInput): Account
updateAccount(id: ID, input: AccountInput): Account
}
type Query {
accounts: [Account]
}
`)
// 定义一个假的数据库
const fakeDb = {};
// 定义查询对应的解析器
const root = {
accounts(){ // 这里做了修改
var arr = [];
for(const i in fakeDb){
arr.push(fakeDb[i]);
}
return arr;
},
// 这里的input相当于拿到的所有字段
createAccount({ input }){
// 相当于数据库的保存
fakeDb[input.name] = input;
// 返回保存的结果
return fakeDb[input.name];
},
updateAccount({ id, input }){
// 相当于数据库的更新
// 从fakeDb中拿到需要的fakeDb[id],拿到之后将input新的属性覆盖到它身上
const updatedAccount = Object.assign({}, fakeDb[id], input);
// 将更新保存到数据库
fakeDb[id] = updatedAccount;
// 返回更新的结果
return updatedAccount;
}
}
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true
}));
app.listen(9000, () => {
console.log("http://localhost:9000/graphql")
});
因为重启之后,之前的数据就消失了,所以需要重新存一次数据

下面来看一下怎么 updateAccount,这里的id暂时先用name来代替

那修改了之后到底有没有存进数据库还是得通过query来看

所以是成功存进去了