ApolloServer.applyMiddleware({express})得到UnhandledPromiseRejectionWarning:TypeError:无法读取属性'undefined的使用

时间:2018-12-28 06:25:04

标签: express apollo-client next.js apollo-server express-graphql

const { ApolloServer, gql } = require('apollo-server-express')

const express = require("express");
const next = require("next");

const dev = process.env.NODE_ENV === "development";
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
  
  const apoloSrv = new ApolloServer({ typeDefs, resolvers });
  const server = express();
  apoloSrv.applyMiddleware({ server});
  
  server.get("*", (req, res) => handle(req, res));

  const PORT = process.env.PORT || 4000;
  server.listen(PORT, err => {
    if (err) throw err;
    console.log(`Ready on :${PORT}`);
  });
});

以下是使用nextjs将apollo-server-express与express框架连接的代码段

在这里,我想使用apollo-server-express 2.0配置graphql。 当我使用节点server.js使用此代码时,我得到了如下错误消息,

“(节点:2904)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“ use””

有人可以看看它,让我知道这里有什么问题。

2 个答案:

答案 0 :(得分:7)

文档中的示例为:

const app = express();
server.applyMiddleware({ app });

这意味着您正在将对象传递到applyMiddleware。在示例中,我们传入的对象是使用shorthand property name notation初始化的,screen shot是ES2015引入的。以上等同于:

server.applyMiddleware({ app: app });

我们的对象有一个名为app的属性,该属性的值等于一个恰好也称为app的变量。如果您这样做:

const myApp = express()
server.applyMiddleware({ myApp });

这意味着您要传入具有myApp属性的对象,更重要的是,缺少了app函数期望的applyMiddleware属性。所以...您的代码需要如下所示:

apoloSrv.applyMiddleware({ app: server});

答案 1 :(得分:0)

const express = require("express");
const router = express.Router();
const { ApolloServer, gql } = require('apollo-server-express');

const server = new ApolloServer({
    schema: schema,
    introspection: true
}); 

server.applyMiddleware({ app:router });

module.exports = router;