突变上未定义的参数,使用 apollo-server

Posted

技术标签:

【中文标题】突变上未定义的参数,使用 apollo-server【英文标题】:Undefined args on a mutation, using apollo-server 【发布时间】:2019-10-02 21:27:24 【问题描述】:

我正在使用 apollo-server,一切都按预期工作,但是当从前端调用突变时,突变参数是未定义的。

const express = require('express');
const morgan = require('morgan');
const  ApolloServer, gql  = require('apollo-server-express');
const mongoose = require('mongoose');
require('dotenv').config();

const app = express();

const typeDefs = gql`
  type msgFields 
    email: String!
    textarea: String!
    createdAt: String!
  

  input MsgFieldsInput 
    email: String!
    textarea: String!
    createdAt: String!
  

  type Query 
    formContact: msgFields!
  

  type Mutation 
    createMsg(email: String!, textarea: String!, createdAt: String!): String!
  

`;

const resolvers = 
  Query: 
    formContact: () => 
      return 
        email: 'test@mail.com',
        textarea: 'checking Checking checking Checking checking Checking'
         
    
  ,
  Mutation: 
    createMsg: (args) => 
      console.log(args); // => undefined here
      return 'Worked';
    
  


const server = new ApolloServer(
  typeDefs,
  resolvers
);


app.use(morgan('dev'));

server.applyMiddleware(app)

mongoose.connect(process.env.MONGO_URL,  useNewUrlParser: true )
  .then(() => 
    app.listen(port: 4000, () => 
      console.log(`Server and DB ready at http://localhost:4000$server.graphqlPath`)
    );
  )
  .catch(err => 
    throw err;
  )

这是我从 /graphql 发送的 突变 createMsg(电子邮件:“test@mail.com” textarea:“测试 textarea” createdAt:“19-05-2018”)

【问题讨论】:

【参考方案1】:

解析器签名如下:(parent, args, context, info) 其中:

parent:包含从父字段的解析器返回的结果的对象,或者在***查询字段的情况下,从服务器配置传递的rootValue。此参数启用 GraphQL 查询的嵌套性质。 args:带有参数的对象传递到查询中的字段中。例如,如果使用 query key(arg: "you mean") 调用该字段,则 args 对象将是: "arg": "you mean" 。 context:这是特定查询中所有解析器共享的对象,用于包含每个请求的状态,包括身份验证信息、数据加载器实例以及解析查询时应考虑的任何其他内容。阅读本节,了解何时以及如何使用上下文。 info:此参数包含有关查询执行状态的信息,包括字段名称、从根到字段的路径等。它仅记录在 GraphQL.js 源代码中,但通过其他模块(如 apollo-cache-control)扩展了附加功能。

参数作为第二个参数传递给解析器,而不是第一个。请参阅the docs 了解更多详情。

【讨论】:

info 未定义。可能的原因是什么?此外,parent 也是未定义的。 @Ilyaskarim 请使用相关代码发布一个新问题 请参阅***.com/questions/57136618/…。如果您能花一点时间来看看问题,那就太好了。 对我来说,所有技巧都失败了,除了一个。关闭文本编辑器和你正在使用的 API 开发工具((我用过 VS Code & Insomnia)。然后重新启动。

以上是关于突变上未定义的参数,使用 apollo-server的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“变异返回数据为空”?

外部 WebSocket 服务器上的 Apollo-Server GraphQL 订阅

错误:不知道如何处理这种类型的突变。突变不遵循命名约定

Apollo GraphQL 嵌套突变

UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“类型”

Flutter / GraphQL - 以自定义类型为参数的突变