Получение ответа, тела и ошибки от асинхронного метода, выполняющего вызов API POST - PullRequest
0 голосов
/ 12 марта 2020

Я использую этот пример для вызова API POST API: https://nodejs.dev/making-http-requests-with-nodejs#perform -a-post-request . Никаких проблем там нет, все работает хорошо.

Далее я хотел создать функцию, которая выполняет этот вызов API, принимая параметры подключения, заголовки и полезную нагрузку динамического c. Сделал это, и я смог вернуть объект ответа из функции, чтобы я мог обнаружить response.statusCode, response.statusMessage, et c. Вот мой Node.js код:

Код модуля

const https = require("https");

function postLendingApplication(connection, data, callback) {
  const options = {
    hostname: connection.hostname,
    port: connection.port,
    path: connection.path,
    method: connection.method,
    headers: connection.headers
  };
  //console.log(options)
  const req = https.request(options, res => {
    console.log(`statusCode: ${res.statusCode}`);

    res.on("data", d => {
      process.stdout.write(d);
    });
    callback(res);
  });

  req.on("error", error => {
    console.error(error);
  });

  req.write(data);
  req.end();
}

exports.postLendingApplication = postLendingApplication;

Вызов кода из другого файла

const bpc = require("./public-api");

const data = JSON.stringify({
  title: 'foo',
  body: 'bar',
  userId: 1
});

const connection = {
    hostname: 'jsonplaceholder.typicode.com',
    port: 443,
    path: '/posts',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length,
    }
}

var response = bpc.postLendingApplication(connection, data, function(response) {
    console.log("Inside the calling function");
    //console.log(response);
    console.log("Status Code: " + response.statusCode);
    console.log("Status Message: " + response.statusMessage);
});

Успешный консольный ответ

statusCode: 201
Inside the calling function
Status Code: 201
Status Message: Created
{
  "title": "foo",
  "body": "bar",
  "userId": 1,
  "id": 101
}

Вопрос: В моем методе обратного вызова я хотел бы получить тело ответа (JSON), а также ошибка, поэтому я могу выполнить некоторые утверждения, основанные на полученном ответе / теле / ​​ошибке. Я не могу понять, как настроить обратный вызов в методе модуля, чтобы он мог вернуть все 3 значения. Если вы можете помочь с этим, это будет с благодарностью.

Вот URL-адрес Repl на случай, если вы захотите попробовать его в Интернете: https://repl.it/@varun_verma / POST-API

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я не на 100% отвечаю на вопрос, который вы задаете, я лично, если вы хотите использовать обратные вызовы таким образом, используйте две функции: одну для обработки ошибки и одну для успешного ответа

однако вы может использовать уничтожение объекта, чтобы дать вам неопределенное значение или установить его по умолчанию на ноль, если вам нравится элемент, который не был возвращен, как показано ниже:

Код модуля

const https = require("https");

function postLendingApplication(connection, data, callback) {
  const options = {
    hostname: connection.hostname,
    port: connection.port,
    path: connection.path,
    method: connection.method,
    headers: connection.headers
  };
  //console.log(options)
  const req = https.request(options, res => {
    console.log(`statusCode: ${res.statusCode}`);
    let data = ''

    res.on("data", d => {
        data += d;
    });

    res.on('end', () => {
        callback({response: res, data});
    });

  });

  req.on("error", error => {
    console.error(error);
    callback({response: res, error});
  });

  req.write(data);
  req.end();
}

exports.postLendingApplication = postLendingApplication;

Вызов кода из другого файла

const bpc = require("./public-api");

const data = JSON.stringify({
  title: 'foo',
  body: 'bar',
  userId: 1
});

const connection = {
    hostname: 'jsonplaceholder.typicode.com',
    port: 443,
    path: '/posts',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length,
    }
}

var response = bpc.postLendingApplication(connection, data, function({ response, data, error}) {
    // if error is not passed back in the object it defaults to undefined
    if (error) console.error(error)
    console.log("Inside the calling function");
    //console.log(response);
    console.log("Status Code: " + response.statusCode);
    console.log("Status Message: " + response.statusMessage);
});

0 голосов
/ 12 марта 2020

Если я правильно понимаю ваш вопрос, вы хотите, чтобы ответ, данные и ошибка были переданы обратному вызову. (где вы в настоящее время только передаете ответ)

Вы можете передать данные в обратный вызов следующим образом:

const req = https.request(options, res => {
    console.log(`statusCode: ${res.statusCode}`);
    let data = '';

    res.on("data", d => {
        data += d;
    });

    res.on('end', () => {
        callback(res, data);
    });
});

Это буферизует данные из ответа, когда он входит в строку и только тогда, когда ответ заканчивается, объект ответа и данные передаются в виде строки для обратного вызова. (затем вы можете использовать JSON .parse в обратном вызове для преобразования строки данных в объект)

Передача ошибки является более сложной, поскольку обратный вызов ошибки дается отдельно от ответа. Я бы порекомендовал иметь отдельный обратный вызов для ошибки:

function postLendingApplication(connection, data, callback, error_callback) {
...
    req.on("error", error => {
        console.error(error);
        error_callback(error);
    });
...
}

Однако кто-то еще может предложить лучшее решение для ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...