Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 TXT文件可以在Heroku上使用stream下载,但PDF文件下载失败-NodeJS,Heroku_Node.js_Heroku - Fatal编程技术网

Node.js TXT文件可以在Heroku上使用stream下载,但PDF文件下载失败-NodeJS,Heroku

Node.js TXT文件可以在Heroku上使用stream下载,但PDF文件下载失败-NodeJS,Heroku,node.js,heroku,Node.js,Heroku,我无法下载pdf文件并使用Heroku run bash在Heroku上查看它。但同样的代码也适用于heroku上的txt文件。然而,同样的代码适用于本地计算机中的txt和pdf文件 我在这里找到了git clone Heroku Nodejs git存储库(git clone),并将应用程序推送到Heroku 在nodejs项目中添加了fs和https库 const express = require('express') const path = require('path') var fs

我无法下载pdf文件并使用Heroku run bash在Heroku上查看它。但同样的代码也适用于heroku上的txt文件。然而,同样的代码适用于本地计算机中的txt和pdf文件

我在这里找到了git clone Heroku Nodejs git存储库(git clone),并将应用程序推送到Heroku

在nodejs项目中添加了fs和https库

const express = require('express')
const path = require('path')
var fs = require('fs');
const https = require('https');

const AWS = require('aws-sdk');

AWS.config.loadFromPath('./config.json');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const URL = "<YOUR_URL>";

const PORT = process.env.PORT || 5000

express()
  .use(express.static(path.join(__dirname, 'public')))
  .set('views', path.join(__dirname, 'views'))
  .set('view engine', 'ejs')
  .get('/', (req, res) => res.render('pages/index'))
  .get('/test', function(req,res) {  

    const file = fs.createWriteStream("XXXXXX-pdf.pdf");
    https.get("XXXXX-pdf.pdf", response => {
      var stream = response.pipe(file);

      stream.on("finish", function() {
        console.log("done");

        try{

            // Create params for putObject call
            const objectParams = {
                Bucket: "<YOUR_BUCKET>", 
                Key: "<YOUR_KEY>", 
                ContentLength: headers['content-length'],
                Body: stream
            };
            // Create object upload promise
            await s3.putObject(objectParams).promise();
        } catch(err){
            console.log("ERROR --->" + err)
        }
      });
    });
  })
  .listen(PORT, () => console.log(`Listening on ${ PORT }`))
const express=require('express'))
const path=require('路径')
var fs=需要('fs');
常量https=require('https');
const AWS=require('AWS-sdk');
AWS.config.loadFromPath('./config.json');
consts3=新的AWS.s3({apiVersion:'2006-03-01'});
const URL=“”;
const PORT=process.env.PORT | 5000
快报()
.use(express.static(path.join(uu dirname,'public'))
.set('views',path.join('views'))
.set('视图引擎','ejs')
.get(“/”,(req,res)=>res.render('pages/index'))
.get('/test',函数(req,res){
const file=fs.createWriteStream(“XXXXXX-pdf.pdf”);
https.get(“XXXXX-pdf.pdf”,响应=>{
var stream=response.pipe(文件);
stream.on(“finish”,function()){
控制台日志(“完成”);
试一试{
//为putObject调用创建参数
常量objectParams={
桶:“,
关键字:“,
ContentLength:headers['content-length'],
主体:溪流
};
//创建对象上载承诺
等待s3.putObject(objectParams.promise();
}捕捉(错误){
日志(“错误-->”+错误)
}
});
});
})
.listen(端口,()=>console.log(`Listening on${PORT}`)
“heroku run bash”无法可靠地查看刚刚上载的文件,因为无法保证它在同一个heroku dyno上运行

heroku上的文件是临时的,它们只在dyno处于活动状态时才持续,并且您也可以为它们获得有限的空间。但是,您可以指望它们在创建它们的dyno中存在足够长的时间,以完成对web请求的处理


因此,正确的解决方案是下载文件,然后将其直接上传到像AmazonS3这样的持久存储服务。虽然官方没有为上传提供流式API,但这很好,因为您可以在响应原始web请求之前要求API上传刚刚下载的文件,您必须这样做才能正确终止它并避免Node.js应用程序中潜在的套接字耗尽。

到底发生了什么?您在网络面板中看到了什么?Heroku控制台中显示了什么?我在Heroku控制台中看到了“完成”。我在“网络”选项卡中没有任何内容,因为我在后端代码中没有返回任何响应。。。因此,请求将一直打开,直到达到超时。@TomBoutell excel文件和任何图像文件(文件不是在heroku中创建的)也会发生同样的情况。。。除了txt文件,我还尝试了上面的代码,包括大小文件。哦,我明白了。你很幸运有了txt文件。Heroku没有在所有worker和web dynos之间共享的单一持久文件系统。您必须将文件存储在S3或类似的云存储服务或数据库中。任何写入“本地驱动器”的文件只能被信任存在于特定的DyNO上,并且将无法在DyNO的重启下幸存,这可能在任何时候都不在处理请求的过程中发生。你的实际目标是什么?@TomBoutell是的,我知道,我只想将它存储在S3中,我知道如何做到这一点,但在我将它上传到S3之前。我需要从外部第三方服务器下载文件。。。这些文件可以驻留在任何域中。所以,我不太确定是否可以直接从外部url将文件上传到S3,所以我跳过了下载部分。因此,“heroku run bash”命令似乎不是交叉验证文件是否已下载的正确方法。我怎么知道当时是否下载了文件?因为我对S3上传有问题。上传到S3的文件似乎都是零字节。所以我觉得我没有正确的道路。要成功上载文件,我需要下载文件的目录/文件夹路径。。。我尝试了一些path,但没有成功…编辑您的问题以显示s3.Done完整解决方案的代码。请检查。您从https获得的“响应”对象是可读的流。您通过管道将其传输到一个文件并等待其完成,然后将管道的返回值(一个可写流,而不是可读流)传递给S3。您只需将响应对象作为主体传递给S3即可。然后,您正在传递一个可读流,其中需要一个可读流。当它完成上传时,您应该注意,因为您必须res.send()某些内容,否则将挂起。