无服务器Node js 跳过 https 请求



我想发送一个https请求并使用无服务器框架处理结果,但它似乎不起作用。

Nodejs(无服务器(跳过我的请求并直接跳转到最后一个结果,而无需等待https响应

这是我的函数:

import { APIGatewayEvent, Callback, Context, Handler } from "aws-lambda";
var AWS = require("aws-sdk");
const querystring = require('querystring');
const https = require('https');
const TOKEN: String = "token";
export const hello: Handler = (
  event: APIGatewayEvent,
  context: Context,
  cb: Callback
) => {
function https_request() {
    var postData = querystring.stringify({
      query: "query"
    });
    var options = {
      hostname: 'example.com',
      port: 443,
      path: '/path',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': TOKEN
      }
    };

    return new Promise(function(resolve, reject) {
      console.log("before request")
      var req = https.request(options, (res) => {
        console.log('statusCode:', res.statusCode);
        console.log('headers:', res.headers);
        if (res.statusCode !== 200) {
          // REJECT IF THE RESPONSE WASN'T AS EXPECTED
          return reject(new Error('Request failed'));
        }
        res.on('data', (d) => {
          process.stdout.write(d);
          resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA
        });
      });
      req.on('error', (e) => {
        console.error(e);
        reject(e); // REJECT ON REQUEST ERROR
      });
      // req.write(postData);
      req.end();
    }) 
  }
  let x:any;

async function myAsyncF() {
    x= await https_request();
    console.log(x.body)
    return x.body
  }
  myAsyncF()
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: x,
      input: event
    })
  };
  cb(null, response);
};

我使用了异步等待,但没有任何返回(如果有一些网络错误之王,我应该至少会收到一个错误(

这是我的输出:请求前{ "状态代码": 200, "body": "{\"input\":\"\"}"}

有什么遗漏吗?

提前谢谢你

在任何时候你都不会解决你的Promise,我不知道你认为什么是"成功"的请求,但这里有一个例子应该让你走上正确的轨道

return new Promise(function(resolve, reject) {
  console.log("before request")
  var req = https.request(options, (res) => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);
    if (res.statusCode !== 200) {
      // REJECT IF THE RESPONSE WASN'T AS EXPECTED
      return reject(new Error('Request failed'));
    }
    res.on('data', (d) => {
      process.stdout.write(d);
      resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA
    });
  });
  req.on('error', (e) => {
    console.error(e);
    reject(e); // REJECT ON REQUEST ERROR
  });
  req.write(postData);
  req.end();
})

remove process.stdout.write 将不是一个很好的做法,因为您在 lambda 上运行代码,使用上下文对象或回调函数返回

process.stdout.write(d( 是对文件的写入操作,有时它也静默失败,在 EC2、ECS 上运行,您的解决方案看起来很宝石。但是在无服务器上,最好避免使用文件操作函数

相关内容

  • 没有找到相关文章

最新更新