Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GCP Nodejs8云功能-同步发布子发布_Javascript_Google Cloud Platform_Google Api_Google Cloud Functions_Google Cloud Pubsub - Fatal编程技术网

Javascript GCP Nodejs8云功能-同步发布子发布

Javascript GCP Nodejs8云功能-同步发布子发布,javascript,google-cloud-platform,google-api,google-cloud-functions,google-cloud-pubsub,Javascript,Google Cloud Platform,Google Api,Google Cloud Functions,Google Cloud Pubsub,我正在努力使用javascript/Nodejs8 Google云函数将有效负载发布到Google PubSub 因此,我有一个由HTTP请求触发的云函数,然后将请求主体发布到pubsub主题(配置为pull模式) 这是我的密码: const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const topic = pubsub.topic('my-fancy-topic'); function

我正在努力使用javascript/Nodejs8 Google云函数将有效负载发布到Google PubSub

因此,我有一个由HTTP请求触发的云函数,然后将请求主体发布到pubsub主题(配置为pull模式)

这是我的密码:

const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub();
const topic = pubsub.topic('my-fancy-topic');

function formatPubSubMessage(reqObj){
    // the body is pure text
    return Buffer.from(reqObj.body);
};

exports.entryPoint = function validate(req, res) {

topic.publish(formatPubSubMessage(req)).then((messageId) => {
            console.log("sent pubsub message with id :: " + messageId)
        });

res.status(200).json({"res":"OK"});
};
我的问题是,在发布pubsub消息之前,云函数完成执行(在日志中,“函数执行耗时X毫秒,完成状态代码:200”的日志显示在My pubsub日志之前大约30或40秒。我还多次看到“忽略已完成函数的异常”的日志我没有得到我的pubsub日志)

我不是javascript或nodejs专家,也不精通javascript承诺,但我想知道是否可以使发布同步。我也在想我可能做错了什么


提前感谢您的帮助。

现在,此代码将在发布完成之前发送响应。发送响应时,函数终止,正在进行的异步工作可能无法完成

相反,您应该做的是仅在发布完成后发送响应,这意味着将该行代码放入
然后
回调中

exports.entryPoint = function validate(req, res) {

    topic.publish(formatPubSubMessage(req)).then((messageId) => {
        console.log("sent pubsub message with id :: " + messageId)
        res.status(200).json({"res":"OK"});
    });

};

我建议花一些时间学习承诺是如何工作的,因为这对于构建正确工作的函数至关重要。

现在,此代码在发布完成之前发送响应。发送响应时,函数终止,正在进行的异步工作可能无法完成

相反,您应该做的是仅在发布完成后发送响应,这意味着将该行代码放入
然后
回调中

exports.entryPoint = function validate(req, res) {

    topic.publish(formatPubSubMessage(req)).then((messageId) => {
        console.log("sent pubsub message with id :: " + messageId)
        res.status(200).json({"res":"OK"});
    });

};

我建议花一些时间学习承诺是如何工作的,因为这对于构建正确工作的函数至关重要。

在您的逻辑中,HTTP消息到达时将调用回调/事件处理程序函数。然后执行一个publish()函数。执行发布是一个异步活动。这意味着发布需要一些时间才能完成,而且由于JavaScript(本质上)不想阻止,因此它会立即返回,并承诺在异步工作完成后,您可以使用它收到通知。在执行publish()之后,您的逻辑立即执行res.status(..),它向HTTP请求发送响应,这实际上是来自HTTP客户端的流请求的结束。异步发布仍在进行中,当它本身完成时,将发生发布回调,并记录响应

不幸的是,这不是一个好的做法,因为谷歌在这里记录

在最后一个故事中,您调用的函数
validate
仍将在发布完成之前结束。如果要在publish()执行时阻塞(有效地使其同步),可以使用JavaScript
wait
关键字。松散地说,类似于:

try {
   let messageId = await topic.publish(....);
   console.log(...);
catch(e) {
 ...
}
您还需要将函数标记为
async
。例如:

exports.entryPoint = async function validate(req, res) {
   ...
见:

您也可以简单地从函数返回一个承诺,在承诺作为一个整体得到解决之前,回调函数不会被视为已解决


底线是深入研究承诺。

在您的逻辑中,当HTTP消息到达时,将调用回调/事件处理程序函数。然后执行一个publish()函数。执行发布是一个异步活动。这意味着发布需要一些时间才能完成,而且由于JavaScript(本质上)不想阻止,因此它会立即返回,并承诺在异步工作完成后,您可以使用它收到通知。在执行publish()之后,您的逻辑立即执行res.status(..),它向HTTP请求发送响应,这实际上是来自HTTP客户端的流请求的结束。异步发布仍在进行中,当它本身完成时,将发生发布回调,并记录响应

不幸的是,这不是一个好的做法,因为谷歌在这里记录

在最后一个故事中,您调用的函数
validate
仍将在发布完成之前结束。如果要在publish()执行时阻塞(有效地使其同步),可以使用JavaScript
wait
关键字。松散地说,类似于:

try {
   let messageId = await topic.publish(....);
   console.log(...);
catch(e) {
 ...
}
您还需要将函数标记为
async
。例如:

exports.entryPoint = async function validate(req, res) {
   ...
见:

您也可以简单地从函数返回一个承诺,在承诺作为一个整体得到解决之前,回调函数不会被视为已解决


底线是深入研究承诺。

谢谢你的回答@Kolban。为了实现您的解决方案plz,您能否精确说明如何将函数标记为异步?再次感谢您。更新的答案包括异步信息谢谢您的贡献。我可以弄清楚它,现在它同步运行@道格的答案对我来说很有效,但我接受你的答案,因为它更“灵活”,而且是我得到的第一个答案。谢谢你,小伙子,这会有帮助的。就我个人而言,我对这些问题并不在意。请随意承认@Doug的答案是正确的。如果他对你的理解增加了价值,你可以考虑对他的答案进行投票。谢谢你的回答。为了实现您的解决方案plz,您能否精确说明如何将函数标记为异步?再次感谢您。更新的答案包括异步信息谢谢您的贡献。我能弄明白,现在它同步运行@道格的答案对我来说很有效,但我接受你的答案,因为它更“灵活”,而且是我得到的第一个答案。谢谢你,小伙子,这会有帮助的。就我个人而言,我对这些问题并不在意。请随意承认@Doug的答案是正确的。如果他有