NodeJS graphqlHTTP不是函数

d5vmydt9  于 2022-12-18  发布在  Node.js
关注(0)|答案(8)|浏览(125)

下面是我的简单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

我该怎么修呢

hmmo2u0o

hmmo2u0o1#

看看documentation

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

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

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

require('express-graphql')返回一个名为graphqlHTTP的 * 对象 *,该对象带有一个 * 属性 *,graphqlHTTP是您要调用的函数。
你试图像调用函数一样调用对象本身。

qqrboqgw

qqrboqgw2#

Quentin的回答很到位。显然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
}));
vojdkbi0

vojdkbi03#

您可以使用

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

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

hc2pp10m4#

只是为了让它更清楚:
在“express-graphql”返回一个直接函数或带有函数的类之前,我们可以将其赋给任何变量,如graphqlServer
const graphqlServer = require('express-graphql');
现在,它返回整个对象,其中包含一个名为“graphqlHTTP”的函数。因此代码应该是
const { graphqlHTTP } = require('express-graphql');
并且为了建立连接,

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

ukdjmx9f5#

此代码是使用express-graphql的早期版本编写的。

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

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

在v0.10.0之后,您需要使用

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

nfg76nw06#

上面的答案解决了同样的问题。
对于任何想知道的人,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

dluptydi

dluptydi7#

简单设置

不要使用自己的参数,严格使用{ 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')
);
ljo96ir5

ljo96ir58#

正如Quentin提到的,你试图调用对象本身,就好像它是一个函数一样。你可以更新下面的行来使用解构:即更新--〉常量图形qlHTTP = require('express-graphql');到--〉const {图形HTTP} =需要('表达式图形');

相关问题