我正在处理一个Graphql项目,在那里,我使用apollo-server-express(v3)对Graphql进行订阅,就像它们在文档中描述的那样。当我使用 PubSub from graphql-subscriptions时,我的订阅工作得很好,但正如文档中所描述的,项目的生产版本不推荐graphql-subscriptions的PubSub,因此为了生产目的,我尝试使用graphql-google-pubsub,就像它们在PubSub的生产库推荐列表中所提供的那样。我提供了下面的代码。
index.jsconst express = require('express');
const { createServer } = require('http');
const { WebSocketServer } = require('ws');
const { useServer } = require('graphql-ws/lib/use/ws');
const { ApolloServer } = require('apollo-server-express');
const { ApolloServerPluginDrainHttpServer } = require('apollo-server-core');
const { GooglePubSub } = require('@axelspringer/graphql-google-pubsub');
const schema = require('./schema');
const app = express();
const httpServer = createServer(app);
const WSServer = new WebSocketServer({
server: httpServer,
path: 'graphql'
});
const pubsub = new GooglePubSub();
const serverCleanup = useServer({ schema, context: { pubsub } }, WSServer);
const apolloServer = new ApolloServer({
schema,
plugins: [
ApolloServerPluginDrainHttpServer({ httpServer }),
{
async serverWillStart() {
return {
async drainServer() {
serverCleanup.dispose();
}
};
}
}
]
});
async function startServer() {
await apolloServer.start();
apolloServer.applyMiddleware({ app });
httpServer.listen(4000, () => {
console.log('Server is up on Port 4000');
});
}
startServer();typeDefs & resolversconst typeDefs = gql`
type Subscription {
count: Int!
}
`;
const resolvers = {
Subscription: {
count: {
subscribe(_, __, { pubsub }) {
return pubsub.asyncIterator('counter');
}
}
}
};现在,对于谷歌凭证,我有credentials.json作为项目的根。我还设置了ENV变量,名为GOOGLE_APPLICATION_CREDENTIALS。
现在的问题是,每当我从阿波罗-工作室运行订阅时,我的终端中就会出现以下错误。

我所有的凭证都在credentials.json文件中。此外,我的服务帐户具有“所有者”角色,并且帐户是“启用”的。我已经在Project.
上启用了“Cloud/Sub”。
发布于 2022-08-05 14:26:31
在我的项目中设置apollo-server-express和graphql-google-pubsub有我的方法:
//route to your serviceAccount or credentials
const serviceAccount = require("../credentials.json");
const options = {
projectId: serviceAccount["project_id"],
credentials: {
client_email: serviceAccount["client_email"],
private_key: serviceAccount["private_key"],
},
};
const commonMessageHandler = (payload)=>{
const dataBuffer = payload.data || '{}';
return JSON.parse(dataBuffer);
}
const topic2SubName = (topicName: string) =>
`projects/${serviceAccount["project_id"]}/subscriptions/${topicName}`;
const pubsub = new GooglePubSub(options, topic2SubName, commonMessageHandler);如果在你的例子中“资源未被找到”,需要检查的东西:
https://console.cloud.google.com/cloudpubsub
topic2SubName处理程序在设置Pubsub实例pubsub.publish(${topicName}, data)何时具有正确的主题名希望这对你有用。
https://stackoverflow.com/questions/72627003
复制相似问题