如何检查对象是否为 node.js 流实例?

How do I check if an object is a node.js stream instance?

我正在尝试检查某个对象 (this) 是否是流实例。我很难确定它是否仍然是函数启动时的原始 this 函数。

我试过 typeof this 并且 returns 和 object。 我看过这件事但没有找到明确的答案..有什么建议吗?先谢谢了

StreamName.prototype._getEndpointData = function ( endpoint ) {
    /* 
    Make a request based on a specific endpoint 
    */
    var apikey = this.source.apikey;

    request.getAsync( { 
        headers: { 
            // 'content-type' : 'application/x-www-form-urlencoded',
            'User-Agent': 'request',
            'Authorization': getAuthByApikey( apikey )
        },
        url: generateUrl( apikey, endpoint )
        })
        .get( 1 ) // get the body 
        .then( function ( body ) {
            if ( body == 'Authentication Failed' ) {
                 throw new Error( body );
            }
            return body;
        })
        .then( JSON.parse )
        .then( function ( body ) {
            if ( body.status == 500 ) {
                throw new Error( body.message || 'MailChimp API request error');
            }

            // collections: lists, campaigns & reports
            var collection = body[ endpoint ]; 

            for (var i in collection ){
                var instanceEndpoint = endpoint + '/' + collection[i].id;

                request.getAsync( { 
                    headers: {
                        'User-Agent': 'request',
                        'Authorization': getAuthByApikey( apikey )
                    },
                    url: generateUrl( apikey, instanceEndpoint )
                    })
                    .get( 1 ) // get the body 
                    // .then( console.log)
                    .then( function ( body ) {
                        if ( body == 'Authentication Failed' ) {
                                throw new Error( body );
                    }
                    return body;
                    })
                    .then( JSON.parse )
                    .then( function ( body ) {
                        return body;
                    })
                    .then( this.push.bind( this ) )
                    // Getting an error Unhandled rejection TypeError: Cannot read property 'bind' of undefined
                    // IS 'THIS' as the same as it was at top of the function?
                    .then( this.push.bind( this, null ) )
                    .catch( this.emit.bind( this, 'error' ) );
            }
        })
}

您应该使用 instanceof 运算符:

var stream = require('stream');
var isStream = this instanceof stream.Readable;

虽然这可能还有一些其他问题,但您可以在这里阅读它们:nodejs: Check if variable is readable stream

this这里指的是request.getAsync

.then( this.push.bind( this, null ) )

你需要在函数的开头保存this对某个变量的引用,然后你可以稍后引用它

StreamName.prototype._getEndpointData = function ( endpoint ) {
    /* 
    Make a request based on a specific endpoint 
    */
    var apikey = this.source.apikey;
    var _stream = this;

    request.getAsync( { 
        headers: { 
            // 'content-type' : 'application/x-www-form-urlencoded',
            'User-Agent': 'request',
            'Authorization': getAuthByApikey( apikey )
        },
        url: generateUrl( apikey, endpoint )
        })
        .get( 1 ) // get the body 
        .then( function ( body ) {
            if ( body == 'Authentication Failed' ) {
                 throw new Error( body );
            }
            return body;
        })
        .then( JSON.parse )
        .then( function ( body ) {
            if ( body.status == 500 ) {
                throw new Error( body.message || 'MailChimp API request error');
            }

            // collections: lists, campaigns & reports
            var collection = body[ endpoint ]; 

            for (var i in collection ){
                var instanceEndpoint = endpoint + '/' + collection[i].id;

                request.getAsync( { 
                    headers: {
                        'User-Agent': 'request',
                        'Authorization': getAuthByApikey( apikey )
                    },
                    url: generateUrl( apikey, instanceEndpoint )
                    })
                    .get( 1 ) // get the body 
                    // .then( console.log)
                    .then( function ( body ) {
                        if ( body == 'Authentication Failed' ) {
                                throw new Error( body );
                    }
                    return body;
                    })
                    .then( JSON.parse )
                    .then( function ( body ) {
                        return body;
                    })
                    .then( _stream.push.bind( this ) )

                    //should replace this with _stream
                    .then( _stream.push.bind( this, null ) )
                    .catch( _stream.emit.bind( this, 'error' ) );
            }
        })
}