从进行 POST API 调用的异步方法中获取响应、body 和错误
Getting response, body and error from an asynchronous method making a POST API call
我正在使用此示例对 API:https://nodejs.dev/making-http-requests-with-nodejs#perform-a-post-request 进行 POST API 调用。没问题,效果很好。
接下来,我想创建一个函数,通过接收动态连接参数、headers 和负载来进行此 API 调用。这样做了,我就能够 return 来自函数的响应 object,这样我就可以检测到 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
}
问题:在我的回调方法中,我想收到响应body(JSON) 以及错误,因此我可以 运行 一些基于我收到的 response/body/error 的断言。我无法弄清楚如何在模块方法中设置回调,以便它可以 return 所有 3 个值。如果您能帮忙解决,我们将不胜感激。
这里是 Repl URL 如果您想在线试一试:https://repl.it/@varun_verma/POST-API
如果我对您的问题的理解正确,您希望将响应、数据和错误传递给回调。 (您目前只传递响应)
您可以像这样将数据传递给回调:
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);
});
...
}
然而,这里的其他人可能能够为该错误提供更好的解决方案。
我不是 100% 同意你问的问题,我个人认为如果你想以这种方式使用回调,请使用两个函数,一个处理错误,一个用于成功响应
但是,如果您喜欢未传回的项目,您可以使用对象破坏来为您提供未定义或默认为 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);
});
我正在使用此示例对 API:https://nodejs.dev/making-http-requests-with-nodejs#perform-a-post-request 进行 POST API 调用。没问题,效果很好。
接下来,我想创建一个函数,通过接收动态连接参数、headers 和负载来进行此 API 调用。这样做了,我就能够 return 来自函数的响应 object,这样我就可以检测到 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
}
问题:在我的回调方法中,我想收到响应body(JSON) 以及错误,因此我可以 运行 一些基于我收到的 response/body/error 的断言。我无法弄清楚如何在模块方法中设置回调,以便它可以 return 所有 3 个值。如果您能帮忙解决,我们将不胜感激。
这里是 Repl URL 如果您想在线试一试:https://repl.it/@varun_verma/POST-API
如果我对您的问题的理解正确,您希望将响应、数据和错误传递给回调。 (您目前只传递响应)
您可以像这样将数据传递给回调:
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);
});
...
}
然而,这里的其他人可能能够为该错误提供更好的解决方案。
我不是 100% 同意你问的问题,我个人认为如果你想以这种方式使用回调,请使用两个函数,一个处理错误,一个用于成功响应
但是,如果您喜欢未传回的项目,您可以使用对象破坏来为您提供未定义或默认为 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);
});