📈
express-graphqlで出たエラーにはまった
何をしようとしたか
GraphQL + Express JS + MongoDBの環境構築をしようと思いました。
しかしサーバーの起動ではまることに。
本題
mongooseを使ってmongoDBと接続。
またapp.use
のハンドラー部分にgraphqlHTTPを指定します。
一見大丈夫そう。
//app.js
const express = require('express')
const graphqlHTTP = require('express-graphql')
const mongoose = require('mongoose')
const app = express()
mongoose.connect('mongodb+srv://testuser001:password@cluster0.fpkid.mongodb.net/my_db?retryWrites=true&w=majority')
mongoose.connection.once('open', () => {
console.log('db connected')
})
app.use('/graphql', graphqlHTTP({
}));
app.listen(4000, () => {
console.log('listening 4000')
})
しかしnodemon app
でサーバーを立ち上げると、graphqlHTTPのところでエラーがでました。
$ nodemon app
[nodemon] 2.0.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
graphql_dir/server/app.js:14
app.use('graphql', graphqlHTTP({
^
TypeError: graphqlHTTP is not a function
at Object.<anonymous> (/graphql_dir/server/app.js:14:20)
なにがダメなのかさっぱり分からず30分ほどはまる。
解決
こちらに使い方がしっかりと書いてありました。
// 正解
const { graphqlHTTP } = require('express-graphql')
つまり下記と同義なんですよね。
const graphqlHTTP = require('express-graphql').graphqlHTTP
graphqlHTTPが記述されているファイルの中身をまんま渡していたようです。
修正し、再びnodemon app
でサーバーを起動。
無事mongoDBにも接続できました!
$ nodemon app
[nodemon] 2.0.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
(node:13225) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
(Use `node --trace-deprecation ...` to show where the warning was created)
listening 4000
(node:13225) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
db connected
あとがき
とはいえ、const graphqlHTTP = require('express-graphql')
のように記述している記事をいくつか見かけています。
間違ってるのか、それでうまく行くのかは分かりませんが、もしエラーが出たら参考にしてください。
Discussion