graphqlHTTP 不是函数

graphqlHTTP is not a function

这是我的简单 graphql express 应用程序

const express = require('express');
const graphqlHTTP = require('express-graphql');

const app = express();
app.use(
    '/graphql',
    graphqlHTTP({
      graphiql: true,
    })
  );

app.listen(4000, () => {
    console.log("listening for request!");
});

我在 运行 时遇到以下错误:

 graphqlHTTP({
    ^

TypeError: graphqlHTTP is not a function
    at Object.<anonymous> (D:\PersonalProjects\GraphQL\server\app.js:7:5)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)  
    at internal/main/run_main_module.js:17:47

我该如何解决?提前致谢!

看看 documentation:

const { graphqlHTTP } = require('express-graphql');

请注意,它使用的解构等价于:

const graphqlHTTP = require('express-graphql').graphqlHTTP;

require('express-graphql') returns 一个 对象 和一个 属性 称为 graphqlHTTP那就是你要调用的函数。

您正试图像调用函数一样调用对象本身。

昆汀的回答很到位。显然 npm documentation 已更新,但 YouTube 上的一些教程并未更新。这就是为什么像我这样的学习者会有一定程度的困惑。 仍然有像

这样的代码的过时版本

这个:https://github.com/iamshaunjp/graphql-playlist/blob/lesson-36/server/app.js

这个:https://github.com/WebDevSimplified/Learn-GraphQL/blob/master/server.js

或者这个:https://github.com/bradtraversy/customerbase/blob/master/server.js

它们都应该更新为

const { graphqlHTTP } = require('express-graphql');

然后

app.use('/graphql', graphqlHTTP({
    schema:schema,
    graphiql:true
}));

上面的回答是否解决了同样的问题

对于任何想知道的人,express-graphql 版本 0.10.0 是相关更改开始的地方,因此您可以检查您的 package.json express-graphql 依赖版本号。

https://www.npmjs.com/package/express-graphql/v/0.9.0
https://www.npmjs.com/package/express-graphql/v/0.10.0

您可以使用

const gqlHTTP = require('express-graphql');

app.use('/graphql', gqlHTTP.graphqlHTTP({
 // something
}))

只是为了更清楚:

在“express-graphql”返回直接函数或带有函数的 class 之前,我们可以将其分配给任何变量,如 graphqlServer

const graphqlServer = require('express-graphql');

现在,它 returns 整个对象内部有一个名为“graphqlHTTP”的函数。因此代码应该是

const { graphqlHTTP } = require('express-graphql');

并建立联系,

app.use('/graphql', graphqlHTTP({
    // your config
})); 

简单设置:

请勿使用您自己的参数,严格使用 { graphqlHTTP }!!!!

只需将 express-graphql 安装为路由处理程序即可:

const express = require('express');
const { graphqlHTTP } = require('express-graphql');
 
const app = express();
 
app.use(
  '/graphql',
  graphqlHTTP({
    schema: MyGraphQLSchema,
    graphiql: true,
  }),
);
 
app.listen(4000, () => {
    console.log('Server is running on port 4K')
);

首先需要解构

const { graphqlHTTP } = require('express-graphql');

Learn more

这段代码是用 express-graphql 的早期版本编写的。

在 v0.10.0 之前,您可以使用

var graphqlHTTP = require('express-graphql');

v0.10.0后需要使用

var { graphqlHTTP } = require('express-graphql');