首页 > 解决方案 > 如何使用 Promise 将正文添加到 JavaScript 中的 POST 请求?

问题描述

我有以下功能适用于 GET 请求:

function httpGet(options) {
return new Promise(((resolve, reject) => {

  
  const request = https.request(options, (response) => {
    response.setEncoding('utf8');
    let returnData = '';

    response.on('data', (chunk) => {
      returnData += chunk;
    });

    response.on('end', () => {
      resolve(JSON.parse(returnData));
    });

    response.on('error', (error) => {
      reject(error);
    });
  });
  request.end();
}));
}

使用以下选项可以正常工作:

let path = `/1/indexes/combined-faq-directions?query=${location}&typoTolerance=false&getRankingInfo=true&optionalWords=${location}`;
    
var options = {
    host: 'YQRKWVXBWV-1.algolianet.com',
    port: 443,
    path: path,
    method: 'GET',
    headers: {
    "X-Algolia-API-Key": "APIKEYXXXX",
    "X-Algolia-Application-ID": "IDXXX"
    }
};

但我现在正在尝试使用相同的格式对不同的 URL 进行 POST。通过邮递员,我可以看到这工作正常,但我似乎无法将其转换为我的承诺的正确格式。

var https = require('follow-redirects').https;
var fs = require('fs');

var options = {
  'method': 'POST',
  'hostname': 'api.airtable.com',
  'path': '/v0/appasoP3zaNL9k8Pj/Analytics',
  'headers': {
    'Authorization': 'Bearer keyxxxx',
    'Content-Type': 'application/json',
    'Cookie': 'brw=brw9wuY1b9RmtTl1q'
  },
  'maxRedirects': 20
};

var req = https.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function (chunk) {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });

  res.on("error", function (error) {
    console.error(error);
  });
});

var postData = JSON.stringify({"records":[{"fields":{"RoomNo":"Room 6"}}]});

req.write(postData);

req.end();

我已尝试对此进行调整,但出现错误 ERR_STREAM_WHITE_AFTER_END

let path = `v0/appasoP3zaNL9k8Pj/Analytics`;

var options = {
  host: "api.airtable.com",
  port: 443,
  path: path,
  method: "POST",
  headers: {
    Authorization: "Bearer keyxxx",
    "Content-Type": "application/json",
  },
};

var postData = JSON.stringify({ records: [{ fields: { RoomNo: "Room 6" } }] });

async function asyncCall() {
  const response = await httpGet(options, postData);

  console.log(response);
}

asyncCall();

function httpGet(options, postData) {
  return new Promise((resolve, reject) => {
    const request = https.request(options, (response) => {
      response.setEncoding("utf8");
      let returnData = "";

      response.on("data", (chunk) => {
        returnData += chunk;
      });

      response.on("end", () => {
        resolve(JSON.parse(returnData));
      });

      response.on("error", (error) => {
        reject(error);
      });
      if (postData) {
        request.write(postData);
      }
    });
    request.end();
  });
}

我想我非常接近,但只是无法弄清楚语法。非常感谢任何帮助!

标签: javascriptpostpromiseasync-awaithttp-get

解决方案


推荐阅读