Home > Back-end >  How to get multiple values out of resolve() and reject()?
How to get multiple values out of resolve() and reject()?

Time:02-26

I would like both resolve() to return {valid_to: cert.valid_to, statusCode, statusMessage} and reject() should return {error: -1, statusCode, statusMessage}.

Question

How can I do that, when statusCode, statusMessage are in a different scope?

const https = require('https');

(async () => {
  const options = {
    hostname: "github.com",
    port: 443,
    path: '/',
    method: 'GET',
    timeout: 1000
  };

  options.agent = new https.Agent(options);
  let valid_to = await new Promise((resolve, reject) => {
    const req = https.request({
      ...options, checkServerIdentity: function (host, cert) {
        resolve(cert.valid_to);
      }
    }).on('error', error => {
      reject(-2);
    });

    req.on("timeout", chunk => {
      reject(-1);
    });

    req.on('response', response => {
      console.log(response.statusCode);
      console.log(response.statusMessage);
    });

    req.end();
  }).catch(error => {
    console.log(error);
    return -3;
  });

})();

CodePudding user response:

I will do something like this.

Edit: You need to specify res.on('data') in the https.request Object. Otherwise, timeout will always emit because there is no activity from the stream.

You can resolve in res.on("data") or res.on("end") and it is up to your use case.

res is an IncomingMessage object is created by http.ClientRequest and passed as the first argument to the 'request' and 'response' event respectively.

req is A reference to the original http.ClientRequest.

Both streams can emit events and you may handle them separately.

Also, when you reject the Promise, you actually cannot get the statusCode and StatusMessage from the req because there is an error in the req and the .on("response") will not be emitted. So, you need to customize the statusCode and statusMessage yourself.

const https = require("https");

// {valid_to: cert.valid_to, statusCode, statusMessage}
// {error: -1, statusCode, statusMessage}.

(async () => {
    const options = {
        hostname: "githubasdfa.com",
        port: 443,
        path: "/",
        method: "GET",
        timeout: 1000,
    };

    options.agent = new https.Agent(options);
    try {
        const response = await new Promise((resolve, reject) => {
            let valid_to;
            let statusCode;
            let statusMessage;
            const req = https
                .request(
                    {
                        ...options,
                        checkServerIdentity: function (host, cert) {
                            valid_to = cert.valid_to;
                        },
                    },
                    res => {
                        res.on("data", chunk => {
                            resolve({
                                valid_to,
                                statusCode,
                                statusMessage,
                            });
                        });

                        res.on("end", () => {
                            console.log("No more data in response.");
                        });
                    }
                )
                .on("error", err => {
                    console.log(err);
                    reject({
                        error: -2,
                        statusCode: "custom code",
                        statusMessage: "unhandled error",
                    });
                })
                .on("timeout", chunk => {
                    reject({
                        error: -1,
                        statusCode: "custom code",
                        statusMessage: "unhandled error",
                    });
                })
                .on("response", response => {
                    statusCode = response.statusCode;
                    statusMessage = response.statusMessage;
                })
                .end();
        });

        console.log(response);
    } catch (error) {
        console.log(error);
    }
})();
  • Related