12

I have written a code to return some data from asynchronous call using promise. While I try to execute I get "Syntax Error await is only valid in async function" and also I get Cannot proxy application requests...Error: connect ECONNREFUSED.

I'm unsure why I get these errors

I have tried using async before the function calls, but it didn't work

var http = require('https');
var httpGet = function(url) {
  return new Promise (function(resolve, reject) {
    http.get(url,function(res) {
      res.setEncoding('utf8');
      var body = ''; 
      res.on('data', function(chunk){ 
        body += chunk;
        console.log("The body is "+ body);
      });
      res.on('end',function(){resolve(body);});
    }).on('error', reject);
  });
};

var body = await httpGet('link');
$.response.setBody(body);

I would want variable body to have the data returned from the httpGet function. Right now I'm getting the above mentioned errors. But without using await, I get the value of body as '{}'.

Please help

1

2 Answers 2

26

await can only be called in a function marked as async. so, you can make an async IIFE and call the httpGet from there.

(async function(){
    var body = await httpGet('link');
    $.response.setBody(body);
})()

Basically when you use one asynchronous operation, you need to make the entire flow asynchronous as well. So the async keyword kindof uses ES6 generator function and makes it return a promise.

You can check this out if you have confusion.

Sign up to request clarification or add additional context in comments.

8 Comments

Thanks it works. But I'm not able to store the data in a global variable. Below is what i tried. var result; (async function(){ result = await httpGet('link'); $.response.setBody(result); })() console.log("The result is "+result);
I get the result as undefined. How to retrieve the data and store in a global variable? Here i'm not able to set the body too. It returns null value
You will get the result undefined because the console.log will run just after initating the async function. You cannot use sync and async operations at the same time.
Do you have any idea on how to solve this issue? I'm stuck with this
It depends on what you want to do with the data. If you want to show it in ui then make a placeholder page, and after the data is there change the page. Or if you want to use a route to return it as an api response you can do that also.
|
1

This is what worked for me.

I initially had:

exports.doSomething = functions.database.ref('/posts/{postId}').onCreate((snapshot, context) => {

    // ... 

    const [response] = await tasksClient.createTask({ parent: queuePath, task });
});

But I added the word async here (before the open parentheses to snapshot) and then the error went away

       // here
.onCreate(async (snapshot, context) => {

So now the code is

exports.doSomething = functions.database.ref('/posts/{postId}').onCreate(async (snapshot, context) => {

    // ... 

    const [response] = await tasksClient.createTask({ parent: queuePath, task });
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.