TypeError: object is not a function问题(涉及到https+gzip解压)
发布于 7 年前 作者 jiazurongyu2015 4284 次浏览 来自 问答

文件结构是 script.js + client 目前是写一份client文件,form的数据通过脚本来实现https提交post,这里出现抛错信息,https在返回时判断是不是gzip 使用了zlib进行解压,但出现了TypeError: object is not a function问题 已经改过命名了,但还有问题。 node.js小菜猫一只,求高手和热心者帮助。

抛错信息如下:

var req = hreq.post(this.options,function (res) {
                   ^
TypeError: hreq.post is not a function
    at Client.httpRequest (D:\QA\performance-framework\node_modules\xxxx\xxxx-client\lib\client.js:69:20)
    at Client.fn (D:\QA\performance-framework\app\script\optest\script.js:65:12)
    at Timeout.breath [as _onTimeout] (D:\QA\performance-framework\node_modules\xxxx\xxxx-client\lib\client.js:34:18)
    at ontimeout (timers.js:386:14)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

抛错的client.js:69:20=> var req = hreq.post(this.options,function (res) //this.options不知道是否有错,如果不这样写找不到options 影响在script.js文件内的

op.httpRequest('/checkin/test/xxx',       //client负责完整url和处理,client客户端配置后,通过Client.prototype.httpRequest来提交boby.
            {
               ......
            }

client.js引用模块如下

var zlib = require('zlib');
var request = require('request');
var hreq =require('https').request;
var querystring = require('querystring');
Client.prototype.init = function (params, cb) 

问题来源具体代码如下:

Client.prototype.init = function (params, cb) {        //prototype init
    this.port = params.port;
    this.host = params.host;

    this.options = {
        agent: false,
        headers: {
            'Accept-Encoding': 'gzip',
            'Content-Type':'application/x-www-form-urlencoded'          
        }
    };
    setImmediate(cb);
}

Client.prototype.httpRequest = function (path, param, callback) {
    this.options.url = 'https://' + this.host + ':' + this.port + path;
    this.options.body = querystring.stringify(param);
    console.log('options <%s>', JSON.stringify(this.options)); //querystring->JSON请求查看options

    var req = hreq.post(this.options,function (res) {   //this.options不知道是否有错,如果不这样写找不到options

            res.on('response', function(){        //res事件
            var chunks = [];

            res.on('data', function (chunk) {      //用于拼接
                chunks.push(chunk);
            });

            res.on('end', function() {
                var message = {};
                message.code = res.statusCode;

                var buffer = Buffer.concat(chunks);
                var encoding = res.headers['content-encoding'];    //下面用于判断格式
                console.log(encoding);

                switch (encoding) {
                    case 'gzip':
                        zlib.gunzip(buffer, function (err, decoded) {      //zlib.gunzip
                            message.body = decoded && decoded.toString()
                            callback(message);
                        });

                        break;
                    case 'deflate':
                        zlib.inflate(buffer, function (err, decoded) {
                            message.body = decoded && decoded.toString()
                            callback(message);
                        });

                        break;
                    default:
                        message.body = buffer.toString()
                        callback(message);
                }
            });
        });
    });
    req.on('error', function (err) {
        console.error(err);
        callback(err);
    });
};
4 回复

原因在T社区朋友帮助下,找到了 var req = hreq.post(this.options,function (res) post不能这样写 可以包在options里,所以我在options写了1个数组,重新定义了 hostname,port,method等 但是输入后,然后改为 =>var req = hreq(this.options,function (res) ,但出现了其他问题。

提示的很明确啊,hreq.post不是一个方法,hreq对象里没有post方法,你看下你hreq是个啥对象?为什么hreq是require(https).request?应该是var hreq = require(‘https’)

来自酷炫的 CNodeMD

@zhangmingfeng 谢谢解答,我如果直接定义,var hreq =require(‘https’).request; 也可以的吗。或者我还是定义成 var https=require(‘https’) 下面在 var req = https.request ?

还有1个问题,request返回的是一串gzip加密过的。我上面这样写可以吗

@jiazurongyu2015 require(‘https’)的request里没有post方法,你要找先弄清楚你需要什么对象!可以查一下api

来自酷炫的 CNodeMD

回到顶部