서버 측 유효성 검사를 허용하는 릴레이 변형을 코딩하려고합니다. 같은 이름의 레코드가 이미 있습니다.서버 측 유효성 검사를 통한 중계 변경
다음은 내 GraphQL 변이입니다.
/* @flow weak */
import {mutationWithClientMutationId,offsetToCursor} from "graphql-relay";
import {GraphQLString, GraphQLList, GraphQLNonNull} from "graphql";
import NominationConnection from '../NominationsConnection';
import ViewerType from '../../../types/ViewerType';
import Helper from '../../../helper/helper';
import Nomination from '../../../model/Nomination';
const mongo = require('mongodb');
/**
* mutationWithClientMutationId()
*
* This helper function helps us create Relay-compliant GraphQL mutations it takes an object with the following params
* { name: "", inputField: { }, outputFields: {}, mutateAndGetPayload: function({}) }
*
*/
export default mutationWithClientMutationId({
// Name of the Mutation
name: "Nomination_Add",
// Describes the fields that should be used when invoking the mutation
inputFields: {
name: {
type: new GraphQLNonNull(GraphQLString)
},
description: {
type: new GraphQLNonNull(GraphQLString)
},
books: {
type: new GraphQLList(GraphQLString)
}
},
// response that will be sent back when the mutation is complete
outputFields: {
NominationsEdge: {
type: NominationConnection.edgeType,
resolve: ({local_id}, { ...args }, context, { rootValue: objectManager }) =>
{
//RT: local_id is the object that was inserted into DB.;
let nomination = local_id[0];
console.log("nomination: ", nomination);
if(nomination.Errors.length > 0){
return objectManager.getListBy('Nomination', nomination, {}, {})
.then((arr) => {
return ({
cursor: null,
node: nomination,
})
})
}else {
let an_Object;
return objectManager.getOneByParam('Nomination', nomination, {_id: nomination.id})
.then((retrieved_Object) => {
an_Object = retrieved_Object;
})
.then(() => objectManager.getListBy('Nomination', an_Object, {}, {}, objectManager.getViewerUserId()))
.then((arr) => {
return ({
cursor: Helper.cursorForObjectInConnection(arr, an_Object, "id"),
node: an_Object,
})
})
;
}
}
},
Viewer: {
type: ViewerType,
resolve: (parent, args, context, {rootValue: objectManager}) => objectManager.getOneById('User', objectManager.getViewerUserId())
}
},
mutateAndGetPayload: ({name, description, books}, context, {rootValue: objectManager}) => {
if(!books){
books = [];
}
return objectManager.add('Nomination', {
name,
description,
books
}, {name: name}).then((local_id) => ({local_id}));
}
});
다음은 나의 릴레이 변이입니다.
/* @flow weak */
import Relay from 'react-relay';
export default class Nomination_addMutation extends Relay.Mutation {
// static fragments = {
// Viewer:() => Relay.QL`
// fragment on Viewer {
// id,
// }
// `,
// };
getMutation() {
return Relay.QL`mutation{Nomination_Add}`;
}
getFatQuery() {
return Relay.QL`
fragment on Nomination_AddPayload {
NominationsEdge,
Viewer {
Nominations(first:500){
edges{
node{
id,
Name,
Description
}
}
}
}
}
`;
}
getConfigs() {
return [{
type: 'RANGE_ADD',
parentName: 'Viewer',
parentID: this.props.Viewer.id,
connectionName: 'Nominations',
edgeName: 'NominationsEdge',
rangeBehaviors: {
// When the ships connection is not under the influence
// of any call, append the ship to the end of the connection
'': 'append',
// Prepend the ship, wherever the connection is sorted by age
// 'orderby(newest)': 'prepend',
},
}];
}
getVariables() {
return {
name: this.props.name,
description: this.props.description,
books: this.props.books,
};
}
getOptimisticResponse() {
return {
Nomination: {
name: this.props.name,
description: this.props.description,
books: this.props.books,
},
Viewer: {
id: this.props.Viewer.id,
},
};
}
}
여기에 내가 어떻게 부르는지가 나와 있습니다.
Relay.Store.commitUpdate(
new Nomination_Add({name: fields.name , description: fields.desc ,Viewer:this.props.Viewer}),
{
onSuccess: response => {
console.log(response);
console.log(response.Nomination_Add);
},
}
);
내 응답 개체에는 Viewer.id 및 clientmuationID 만 있습니다. graphql을 통해이 돌연변이를 호출하면 다음과 같이 보입니다.
mutation{
Nomination_Add(input:{name:"test", description:"test", clientMutationId:"2"}){
NominationsEdge{
node{
Name,
Description,
Errors {
Message
}
Books{
Title
}
}
}
}
}
응답이 있습니다.
로직을 작성하기 위해 릴레이를 통해 내 서버 유효성 검사 오류 메시지를 다시 클라이언트로 가져올 수 있습니까?
도
return Relay.QL`
fragment on Nomination_AddPayload {
NominationsEdge {
node{
Errors {
Message
}
}
},
Viewer {
Nominations(first:500){
edges{
node{
id,
Name,
Description
}
}
}
}
}
`;
응답은 다음과 같습니다 내 지방 쿼리로이 시도 : 당신이 릴레이를 이야기하지 않았기 때문에 당신은 서버 측 유효성 검사 오류 메시지를받을 수없는
{,…}
data
:
{Nomination_Add: {clientMutationId: "0", Viewer: {id: "00000000-0000-0000-0000-000000000000"}}}
Nomination_Add
:
{clientMutationId: "0", Viewer: {id: "00000000-0000-0000-0000-000000000000"}}
Viewer
:
{id: "00000000-0000-0000-0000-000000000000"}
id
:
"00000000-0000-0000-0000-000000000000"
clientMutationId
:
"0"
'뷰어 : {ID : "00000000-0000-0000-0000-000000000000"}'<- (GraphQL 유형이 아니라 GraphQL 유형이 연결된 객체) 뷰어 객체에 'id'를 지정했는지 확인할 수 있습니까? –
예, 현재 앱을 제작하는 동안 앱을 할당하고 있습니다. – jackncoke
graphiql 인터페이스에서 다음 쿼리를 실행할 때 어떤 결과가 발생합니까? '쿼리 XYZ { 뷰어 { ID (첫번째 : 1) 후보 { 가장자리 { 노드 { 아이디, 이름, 설명 } } } } 은}' –