node用request转发请求,post/json格式,后端收不到请求直接报错

瓦蕾
  • 21
reqData({
        url: url,
        body: req.query.data, //这里是json字符串
        timeout: timeout,
        method: method,
        headers: {
            "content-type": "application/json; charset=utf-8"
        }
    }, function(err, data) {

        if(!err) {
            res.write(JSON.stringify(data));
            res.flush();
            res.end();
        } else {
            var result = {
                flag:1,
                msg:'未找到符合条件的结果'
            }
            res.end(JSON.stringify(result));
        }
    });
    
    function reqData(options, callback) {
    logger.info('request options:', options);

    request(options, function(err, response, body) {
        if(err) {

            logger.error("Error:" + err.message +"\n" + err.stack + "\n", 'request & response body:', options, body);
            callback(err);
        } else {
            try {
                callback(null, JSON.parse(body));
            } catch(err) {
                logger.error("Error:" + err.message +"\n" + err.stack + "\n", 'request & response body:', options, body);
                callback(err);
            }

        }
    });

}
    
    
    

node日志一直再报error,并且 错误码400,但是后端实际上没有收到我的请求,不知道是哪里的原因

回复
阅读 3.1k
4 个回答

排查步骤:
1、确定能正常访问服务器。可本地通过 ping 命令,查询下访问结果;
2、如果能正常访问,把参数全部打印出来,通过 postman 等接口调试工具访问,看看是否有异常;
3、如果 postman 访问正常,就检查代码,看看哪一项和 postman 的设置不一致;如果 postman 访问异常,尝试将 content-type 修改为其它值,一一校验。

在nodejs中,get请求和post请求的参数获取方式是不一样的,get请求可以直接拿参数,post请求做不到,需要等待end事件后才能拿到完整的参数。
你需要排除干扰项定位问题,先尝试简单的get请求是否正常,用于验证node的请求和响应逻辑是否正确

400的话一般是参数错误,首先检查一下content-type,然后检查一下请求方法和传参方式

一种情况是后端使用了代理服务器,你的请求host有没有修改成接口地址的hostname?如果还是你的浏览器地址的话,可能被代理服务器拦截了。

第二种是post请求的时候,服务器会判断header的content-length是否跟你的data的length一致,如果不一致,直接会被断掉,因为这是一次错误的请求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏