繁体   English   中英

从进行 POST API 调用的异步方法获取响应、正文和错误

[英]Getting response, body and error from an asynchronous method making a POST API call

我正在使用此示例对 API 进行 POST API 调用: https://nodejs.dev/making-http-requests-with-nodejs#perform-a-post-request 没有问题,它运行良好。

接下来,我想创建一个函数,通过接收动态连接参数、标头和有效负载来调用此 API。 这样做了,我可以从函数返回响应对象,这样我就可以检测 response.statusCode、response.statusMessage 等。这是我的 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 个值。 如果你能帮忙解决这个问题,将不胜感激。

这是 Repl URL,以防您想在线试用它: https : //repl.it/@varun_verma/POST-API

我不是 100% 你问的问题,我个人如果你想以这种方式使用回调,请使用两个函数,一个用于处理错误,一个用于成功响应

但是,如果您喜欢未传回的项目,则可以使用对象销毁为您提供 undefined 或将其默认为 null,如下所示:

模块代码

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);
});

如果我正确理解您的问题,您希望将响应、数据和错误传递给回调。 (您目前仅通过响应)

您可以像这样将数据传递给回调:

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);
    });
...
}

然而,这里的其他人可能能够为错误提供更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM