はじめに
GraphQLを学び始めたばかりで、「DenoでApollo Serverを動かしてみたい!」という方は少ないかもしれません。
でも、そんなちょっと尖った初学者の皆さん(と未来の自分)に向けて、DenoでGraphQL環境を構築したときにハマった落とし穴と、その回避方法を共有します。
🛠 使用環境
以下の環境で検証しました:
- Deno: 2.1.6
- Node.js: 23.6.0
- Apollo Server: 3.13
- GraphQL: 16.10.0
DenoとNode.jsでまったく同じコードを動かしたのに、出力結果が違って困った…というお話です。
🚀 Apollo Serverの立ち上げコード(共通)
Node.jsとDeno、どちらも使用したコードはこちらです:
import { ApolloServer } from 'apollo-server';
import { typeDefs, resolvers } from "./schema.ts";
const server = new ApolloServer({
typeDefs,
resolvers,
});
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
schema.tsからなんか呼び出してますが、本題とは違うので一旦無視で
💣 異なる挙動
このコードをそれぞれの環境で実行すると、出力されるURLが異なっていました。
✅ Deno の実行結果
🚀 Server ready at http://0.0.0.0:4000/
✅ Node.js の実行結果
🚀 Server ready at http://localhost:4000/
ぱっと見、「ちょっと違うだけじゃん?」と思うかもしれませんが、ここがかなり厄介な落とし穴でした。
追記:
このPRを見る限りこの挙動はDeno側の意図した挙動のようです。
❗ Apollo Studio に接続できない問題
Denoで表示された http://0.0.0.0:4000/
を使って、Apollo Studioから接続しようとすると、こんなエラーが発生します:
これは、HTTPSなApollo Studioが、HTTPかつ「0.0.0.0」なURLにアクセスできないというセキュリティ上の制限が原因です。
つまり、Apollo StudioがGraphQLサーバーを認識してくれない=開発が進められない!という状態に。
✅ 回避方法
Apollo Serverの listen()
に host
オプションを明示的に指定することで、挙動を統一しつつ、Apollo Studioにも接続できるようにできます。
server.listen({ host: "localhost", port: 4000 }).then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
これで DenoでもNode.jsでも、localhost(127.0.0.1)
で統一して動作させることができ、Apollo Studioの接続エラーも解消されました 🎉
🧠 まとめ
- DenoとNode.jsで同じコードでも、デフォルトのバインド先が異なる
-
0.0.0.0
とlocalhost
の違いは、実行環境のネットワーク挙動に影響する - Apollo Studioが
0.0.0.0
に接続できず、エラーになる落とし穴がある - 明示的にホスト名を指定することで、落とし穴を回避可能
Denoでの開発はまだまだマイナーですが、こうした細かい違いに気づけると、トラブルを減らすことができるのかなと思いました。
📌 最後に
この記事が、DenoでGraphQLにチャレンジする誰か(または未来の自分)のお役に立てば嬉しいです!
もっとスマートな回避策や何か間違っている点があればコメントで教えていただけると助かります〜
ノシ
参考