如何检查对象是否为 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' ) );
}
})
}
我正在尝试检查某个对象 (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' ) );
}
})
}