开发者社区 问答 正文

Firebase Express服务器-无法连接到WebSocket端点

0

我正在尝试通过firebase函数运行graphql订阅,我进行了以下设置:

import * as functions from 'firebase-functions'; import { ApolloServer, gql } from 'apollo-server-express';

import { PubSub } from 'apollo-server-express';

const pubsub = new PubSub();

const typeDefs = gql` type Post { author: String comment: String } type Query { hello: String posts: [Post] } type Subscription { postAdded: Post }

type Mutation { addPost(author: String, comment: String): Post }

`;

const POST_ADDED = 'POST_ADDED';

class Poster { public posts() { return [] }

public addPost(args: any) {

}

}

const postController = new Poster();

const resolvers = { Subscription: { postAdded: { // Additional event labels can be passed to asyncIterator creation subscribe: () => pubsub.asyncIterator([POST_ADDED]), }, }, Query: { hello: () => 'Hello world!', posts(root: any, args: any, context: any) { return postController.posts(); }, }, Mutation: { addPost(root: any, args: any, context: any) { pubsub.publish(POST_ADDED, { postAdded: args }); return postController.addPost(args); }, },

};

const server = new ApolloServer({ typeDefs, resolvers, subscriptions: { onConnect: (connectionParams, webSocket) => {

    },
  },
 });

const express = require("express")

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

app.get("*", (request:any, response:any) => { response.send("Hello from Express on Firebase!") }) app.listen({ port: 4000 }, () => console.log( Server ready at http://localhost:4000${server.graphqlPath}) )

const api = functions.https.onRequest(app)

module.exports = { api } 当我尝试使用游乐场通过此查询进行连接时:

subscription { posts { author comment } } 我收到一个错误:

"error": "Could not connect to websocket endpoint ws://localhost:5001/graphql. Please check if the endpoint url is correct." 我是否在exprses服务器中缺少某些配置,或者firebase不能正确支持套接字?

展开
收起
被纵养的懒猫 2019-09-27 19:39:42 848 分享 版权
阿里云 AI 助理回答

在你的设置中,你尝试通过 Firebase Functions 运行 GraphQL 订阅,但是遇到了连接 websocket 的问题。Firebase Functions 默认不直接支持 WebSocket 连接,因为它主要设计用于处理 HTTP 请求。而 Apollo Server 的订阅功能依赖于 WebSocket 来实现实时数据推送。

要解决这个问题,你需要使用 Firebase Cloud Firestore、Realtime Database 或者其他兼容的云消息传递服务(如 Google Cloud Pub/Sub)来间接支持 WebSocket 和实时订阅。然而,这通常涉及到更复杂的架构设计,并非直接在 Firebase Functions 中运行 GraphQL 订阅那么简单。

如果你希望在 Firebase 环境下使用 GraphQL 订阅,一个可行的替代方案是部署你的 GraphQL 服务器到一个支持 WebSocket 的环境,比如 Vercel、Heroku 或者 Google Cloud Run,然后让 Firebase Functions 作为代理或者仅处理无状态的查询和变更操作。

但如果你坚持要在 Firebase 生态内实现,可以考虑以下变通方法:

  1. 使用 Firebase Realtime Database 或 Cloud Firestore:监听数据库的变化,而不是直接通过 WebSocket。这意味着你需要在客户端订阅数据库的变化,而不是 GraphQL 订阅。

  2. Cloud Functions Triggers:利用 Firebase 的 Cloud Functions 事件触发器(例如 onCreate, onUpdate),每当数据库有变化时触发函数,然后通过 FCM(Firebase Cloud Messaging)推送通知给客户端。这样虽然不是传统的 GraphQL 订阅,但能实现类似的数据更新通知功能。

  3. 探索 Firebase Hosting + Cloud Functions 的组合:尽管 Firebase Hosting 主要用于静态内容托管,但它现在支持通过 Cloud Functions 实现一些边缘计算能力,可能有办法间接支持 WebSocket,但这需要深入研究和实验。

  4. 使用第三方服务集成:考虑使用像 Hasura、AppSync 这样的服务,它们提供了与 Firebase 集成的能力,并且原生支持 GraphQL 订阅。

综上所述,直接在 Firebase Functions 中运行 Apollo Server 的订阅功能并不直接支持,需要采用上述提到的某种变通方案。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答