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不能正确支持套接字?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在你的设置中,你尝试通过 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 生态内实现,可以考虑以下变通方法:
使用 Firebase Realtime Database 或 Cloud Firestore:监听数据库的变化,而不是直接通过 WebSocket。这意味着你需要在客户端订阅数据库的变化,而不是 GraphQL 订阅。
Cloud Functions Triggers:利用 Firebase 的 Cloud Functions 事件触发器(例如 onCreate
, onUpdate
),每当数据库有变化时触发函数,然后通过 FCM(Firebase Cloud Messaging)推送通知给客户端。这样虽然不是传统的 GraphQL 订阅,但能实现类似的数据更新通知功能。
探索 Firebase Hosting + Cloud Functions 的组合:尽管 Firebase Hosting 主要用于静态内容托管,但它现在支持通过 Cloud Functions 实现一些边缘计算能力,可能有办法间接支持 WebSocket,但这需要深入研究和实验。
使用第三方服务集成:考虑使用像 Hasura、AppSync 这样的服务,它们提供了与 Firebase 集成的能力,并且原生支持 GraphQL 订阅。
综上所述,直接在 Firebase Functions 中运行 Apollo Server 的订阅功能并不直接支持,需要采用上述提到的某种变通方案。