读取超时。向node.js API发送POST请求时出错

时间:2019-10-09 23:18:35

标签: python node.js

我有一个node.js API,如下所示,我从python发送了一个POST请求,如下所示,面临的问题是如果我删除了 headers={"Content-Type": "application/json"}的POST很糟糕,如果我没有收到Read timed out. error,谁能提供有关如何解决此超时错误的指南?

node.js端点

app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: ''
        }

        req.on('data', (c) => {
            //console.log(c)
            d.body = d.body + c
        });

        req.on('end', () => {
            DATA.push(d);
            res.end('Saved BATS job details');
            //res.status(200).json({
              //message: "Saved BATS job details",
              //posts: req.body
          //}); 
        });
});

Python POST

try:
json"},timeout=10.0)
    r = requests.post(webhook_url,data=json_data.encode("utf8"),verify=False,headers={"Content-Type": "application/json"})
    print "posted"
    print(r.status_code, r.reason)
    print r.url
    print r.text
except Exception as e:
    print (e)

错误:-

  InsecureRequestWarning)
HTTPSConnectionPool(host='company.com', port=443): Read timed out. (read timeout=10.0)

4 个答案:

答案 0 :(得分:1)

我似乎您正在使用express.js。我相信您的问题是,该正文实际上已经被解析。您可以通过阅读req.body进行检查。造成这种情况的原因是,express.js已经读取了整个主体(由于内容类型),而再次尝试读取主体将导致超时(未发出事件data和事件end)。 有几种解决方法。

  1. 禁用express.js主体解析器-或重新配置它以忽略json

  2. 删除阅读的正文代码并直接使用req.body

app.post("/api/bats_push",(req, res) => {
        //console.log("Calling bats_push...")
        const d = {
            method: req.method,
            headers: req.headers,
            query: req.query,
            body: req.body
        }

        DATA.push(d);
        res.end('Saved BATS job details');
});

答案 1 :(得分:0)

根据请求为何不使用此功能:

class White (Pieces):

    def __init__(self):
        #stuff
    def pawn(self, pieceposition):
        empassant=#empassant from the pieces class

答案 2 :(得分:0)

看起来可能与您的SSL有关。 在服务器运行的情况下,检查是否将相同的错误发送给本地主机。

答案 3 :(得分:0)

根据您的问题,关键字是:

如果我删除headers = {“ Content-Type”:“ application / json”},那么POST就显得很简单。

原因可能很清楚:使用标题是错误的方式。

简单地说:node.js应用在检查逻辑代码之前先检查标头。

如果不自己发送标头,则请求部分使用以下默认标头:

{
  'User-Agent': 'python-requests/2.22.0', 
  'Accept-Encoding': 'gzip, deflate', 
  'Accept': '*/*', 
  'Connection': 'keep-alive', 
}

通过请求的代码可以在发布时打印默认标题。

您只需使用标题

{"Content-Type": "application/json"}

可能导致node.js应用认为要求不是合法的(我不知道该用英语来解释这个词)。

如果node.js应用程序是您自己开发的,则可以在创建tcp连接之后并在逻辑代码之前尝试查找框架的检查,方法是读取源代码。

如果不是您自己开发的node.js应用程序,请尝试更改标头并混合默认标头,以查找由node.js应用程序检查的标头密钥。

但是在我看来,这是关于node.js应用的界面描述的导入:

我们只是通过接口描述engouth使用,只需要从api标头的检查中知道错误,该描述应该向我们显示但不向我们显示?

希望能为您提供帮助。

相关问题