Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无服务器节点跳过https请求_Javascript_Node.js_Typescript_Aws Lambda_Serverless - Fatal编程技术网

Javascript 无服务器节点跳过https请求

Javascript 无服务器节点跳过https请求,javascript,node.js,typescript,aws-lambda,serverless,Javascript,Node.js,Typescript,Aws Lambda,Serverless,我想发送一个https请求并使用无服务器框架处理结果,但它似乎不起作用 Nodejs(无服务器)跳过我的请求并直接跳转到最后一个结果,而无需等待https响应 以下是我的职能: import { APIGatewayEvent, Callback, Context, Handler } from "aws-lambda"; var AWS = require("aws-sdk"); const querystring = require('querystring'); const 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, “正文”:“{\”输入\“:\“\”}” }

有什么东西不见了吗


提前感谢您

您在任何情况下都不会解决您的承诺,我不知道您认为什么是“成功”的请求,但这里有一个例子可以让您走上正确的道路

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

删除process.stdout.write将不是一个很好的实践,因为在lambda上运行代码时,请使用上下文对象或回调函数返回


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

谢谢您的回复,但仍然不起作用,它跳过了https.request函数,没有状态码或标题的日志,我只在请求前收到{“statusCode”:200,“body”:“{“message\”:\”,“input\”:\“}”@h、 zak这是因为在你看来,你只是在
cb
中返回了那个对象,你需要从
http\u请求
中获得结果,并将其添加到响应的主体中,如果这是你的意图的话。我添加到主体中,但没有任何改变,我更新了问题中的代码,因为我无法将其放在注释中。问题是使用请求承诺包解决的,我真的不知道我错过了什么exactly@h.zak您的代码中存在多个问题,例如未解决承诺(我的答案所述)但是您没有从
myAsyncF
传播结果,最后也没有等待该函数的结果。我认为建议“使用请求-承诺包”解决问题可能有点模糊。