Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js express.js和request.js-使用回调语法时PDF传输不完整 简化问题_Node.js_Requestjs - Fatal编程技术网

Node.js express.js和request.js-使用回调语法时PDF传输不完整 简化问题

Node.js express.js和request.js-使用回调语法时PDF传输不完整 简化问题,node.js,requestjs,Node.js,Requestjs,为什么,在使用express.js和request.js时,以下两个示例: request.get(url) .on('response'(requestjsResponse)=>{ requestjsResponse.pipe(res); }) 及 request.get(url,(err,requestjsResponse,requestjsBody)=>{ res.send(requestjsResponse) }) 即使requestjsBody包含预期内容,也不会产生相同的结果 详

为什么,在使用express.js和request.js时,以下两个示例:

request.get(url)
.on('response'(requestjsResponse)=>{
requestjsResponse.pipe(res);
})

request.get(url,(err,requestjsResponse,requestjsBody)=>{
res.send(requestjsResponse)
})
即使
requestjsBody
包含预期内容,也不会产生相同的结果

详细问题 我有两个
express.js
版本的route handler,它们正在为多种文件类型处理一些文件代理过程。代码使用标准的express.js
req/res/next
符号。基本上,对于这个问题,从后台来看,非代码信息可能很重要的一点是,主要返回的两种类型处理如下:

  • PDF:应在浏览器内打开,其大小通常不小于 小于18K(根据内容长度标题)
  • EML:应该是 下载时,其大小通常小于16K(根据 内容长度(标题)
两个处理程序版本都使用
request.js
,其中一个具有

get(url:string,callback:(错误,响应,正文)=>void)

表单,我将称之为回调表单,其中整个主体都应该在这样的回调中。在本例中,对用户的响应是通过plain express.js
res.send(body)
发送的。另一个是使用表单

get(url:string).on(事件:'response',回调:listener:(request.response)=>void)

我将其称为事件/管道表单,并通过
request.response.pipe(res)
内部的“response”处理程序将响应传递给最终用户。代码清单中提供了详细信息

我无法找到这两种形式之间的区别,但是: 对于.eml(MIME message/rfc822,您可以将它们威胁为花哨的HTML)文件,这两个版本的工作方式完全相同,文件可以很好地下载

对于.pdf,当使用事件/管道表单
get(url).on('response',callback)
时,我能够成功地将pdf文档传输到客户端。当我使用回调表单(即
get(url:string,callback:(Error,Response,Body)=>void)
)时,即使我在调试器中偷看Body(似乎是完整的PDF,包含PDF头、EOF标记、e.c.t),客户端也只会收到一些奇怪的声明HTML的前言:

<!doctype html><html><body style='height: 100%; width: 100%; overflow: hidden; margin:0px; background-color: rgb(82, 86, 89);'><embed style='position:absolute; left: 0; top: 0;'width='100%' height='100%' src='about:blank' type='application/pdf' internalid='FD93AFE96F19F67BE0799686C52D978F'></embed></body></html>
基于工作事件/管道版本:

const r=请求
.get(url)
.on('响应',(文档响应)=>{
if(Number.parseInt(documentsResponse.headers['content-length'],10)!=0){
//在PDF和TIFF的标题中,使用了一个
if(mimetype==='application/pdf'){
logger.info(‘覆盖标题(PDF)’);
res.set('content-type','application/pdf');
res.set('content-disposition','inline;filename=“someName”.pdf')
logger.info('Document Download Headers(overrided):',documents response.Headers);
}
if(mimetype==='message/rfc822'){
logger.info('overwriting Headers(message/rfc822)');
res.set('content-type','message/rfc822');
res.set('content-disposition','attachment;filename=“someName”.eml');
info('Document Download Headers(overrided):',res.Headers);
}
r、 管道(res);/*响应通过管道传输到客户端*/
}否则{
res.redirect(get404Navigation());
}
}
.on('数据',(d)=>{
log('我们正在这里调试')
})
带有
r.pipe(res)
的零件看起来特别可疑的事件(请参见声明位置和使用位置),这是两种情况下都能正常工作的版本

我假设,这个问题可能是由发送多部分内容的性质引起的,所以我添加了额外的
on('data',(d)=>{})
callbacks,并设置breakepoint以查看响应何时结束/管道化与调用数据处理程序时的情况,结果符合我的预期:

request(url,(err,response,body))
case,数据处理程序被调用了两次,在执行回调之前,处理程序内部可以访问整个主体,所以我更不清楚的是,我不能仅仅
res.send
它。
request.get(url).on('response')
首先调用到res的管道,然后调用两次数据处理程序。我相信node.js HTTP引擎的内部核心正在执行异步技巧,并在收到每个响应块时一个接一个地推送响应

我会很高兴得到任何解释,我做错了什么,我可以调整什么使我的回调版本在PDF案例中按预期工作

结语: 为什么要使用这样的代码?我们的后端正在从外部检索PDF数据,未公开给公共internet服务器,但由于遗留原因,一些标题设置不正确(主要是
内容配置
),因此我们正在拦截它们,并充当数据源和客户端之间的对齐代理