我有一个函数可以在服务器启动时创建主题和订阅。
问题是我无法创建链接到新创建主题的订阅,Google PubSub 服务器会抛出 NOT FOUND 错误。
我什至在主题创建后添加了 20 秒超时,但没有任何改变 T_T
export async function init() {
// promises.topics is an array of promises
const topics = await Promise.all(promises.topics);
console.log('YEAH !!! TOPIC IS GOOD !', topics);
// That works ! And it is created in my remote google PubSub
await timeout(20000);
console.log('Lets Check if it exists !!!');
// promises.getTopics is an array of :
// getTopics.push(pubSubClient.topic(topic.name).get());
// That throws a NOT FOUND
const get = await Promise.all(promises.getTopics);
// Failes because Topics are not found
const subscriptions = await Promise.all(promises.subscriptions);
}
当我检查 Google 日志时,创建的主题是在订阅 oO 之后创建的
我的 Promise 数组注入(inject)第一个主题,然后是订阅 promise 。
当添加每2秒重试10次的重试功能时,它也不起作用。
它甚至没有显示在谷歌日志中,我认为他们的 API 有一个缓存,只返回新处理的数据而无需重新尝试。
你有什么想法吗?
谢谢:)
订阅错误:
编辑:
在将主题 promise 创建推送到我的 promise 数组中后,我设法通过添加超时('2000')来解决问题。
最佳答案
所以,当我像这样创建 Promise 数组时:
async function constructPromises() {
const topics = [];
const subscriptions = [];
for (const topic of pubSubConfig.topics) {
subscriptions.push(createTopic(topic.name));
// Have to add this timeout, otherwise the topic is not found oO
await timeout(1000);
}
for (const topic of pubSubConfig.topics) {
for (const sub of topic.subscriptions) {
subscriptions.push(createSubscription(topic.name, sub));
}
}
return { topics, subscriptions };
}
我必须添加此超时,否则 gcloud 无法找到主题。
我认为这是因为 gcloud 在处理请求之前发送了解析 Promise。 因此,当您创建订阅时,他无法找到该主题。 但我无法验证这一点,有谁知道为什么吗?!!
我想删除这个超时以获得更加不可知的实现。 更奇怪的是,我发现如果你只是在for循环中调用promise,不需要超时!
for (const topic of pubSubConfig.topics) {
const topicResponse = await createTopic(topic.name);
topics.push(topicResponse);
for (const sub of topic.subscriptions) {
const subResponse = await createSubscription(topic.name, sub);
subscriptions.push(subResponse);
}
}
return { topics, subscriptions };
}
所以我的问题解决了,但我仍然有这个问题:P
关于node.js - 获取新创建的主题时,Google PubSub 抛出 "Not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50844471/