Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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
Javascript Fetch blob error-net::ERR\u内容\u长度\u不匹配200(正常)_Javascript_Node.js_Express_Fetch_Blob - Fatal编程技术网

Javascript Fetch blob error-net::ERR\u内容\u长度\u不匹配200(正常)

Javascript Fetch blob error-net::ERR\u内容\u长度\u不匹配200(正常),javascript,node.js,express,fetch,blob,Javascript,Node.js,Express,Fetch,Blob,我有以下代码可以在我的node js express web app(通过MS Azure托管)中从前端发出获取请求。 对于较小的zip文件blob,该请求可以正常工作,但对于较大的blob,它最终会超时并给出以下错误-net::ERR_CONTENT_LENGTH_MISMATCH 200(OK) 这是node.js express文件夹中的我的app.js //'use strict'; var debug = require('debug'); var express = require(

我有以下代码可以在我的node js express web app(通过MS Azure托管)中从前端发出获取请求。 对于较小的zip文件blob,该请求可以正常工作,但对于较大的blob,它最终会超时并给出以下错误-net::ERR_CONTENT_LENGTH_MISMATCH 200(OK)

这是node.js express文件夹中的我的app.js

//'use strict';
var debug = require('debug');
var express = require('express');
var Path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var csrf = require('csurf');
var bodyParser = require('body-parser');
var http = require("https");
var favicon = require('serve-favicon');
const resolve = require("path").resolve;
var JsZip = require('jszip');
var fs = require('fs-extra');
const uuid = require("uuid");
var request = require('request');
var https = require('https');

const axios = require("axios");

const path = require("path");
const fsExtra = require("fs-extra");
var Scraper = require("image-scraper");

//ENVIRONMENT SETUP
const currentEnv = 'PROD'; //Either 'PROD' OR 'DEV'
const cloudinaryFolder = 'inspectAPP'; //Either 'inspectAPP' OR 'inspectAPP-dev'

// setup route middlewares
var csrfProtection = csrf({ cookie: true })

var app = express();

//Set up helmet
var helmet = require('helmet');
app.use(
  helmet.contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'", "cdnjs.cloudflare.com", "ajax.googleapis.com", "maxcdn.bootstrapcdn.com", "cdn.jsdelivr.net", "stackpath.bootstrapcdn.com"],
      styleSrc: ["'self'", "'unsafe-inline'", "stackpath.bootstrapcdn.com", "fonts.googleapis.com", "cdnjs.cloudflare.com", "maxcdn.bootstrapcdn.com", "use.fontawesome.com"],
      imgSrc: ["*", "'self'", "cdnjs.cloudflare.com"],
      fontSrc: ["*", "'self'", "fonts.gstatic.com"],
      frameSrc:["'self'","jimmywarting.github.io"],
      objectSrc: ["'none'"],
      connectSrc: ["'self'", "res.cloudinary.com", "cloudinary.com"],
      upgradeInsecureRequests: [],
    },
  })
);
app.disable('x-powered-by');


// view engine setup 
// view engine setup
app.set('views', Path.join(__dirname, 'views'));
app.set('view engine', 'pug');


app.use(favicon(__dirname + '/public/images/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(bodyParser.json());
// parse some custom thing into a Buffer
var rawOptions = {
  inflate: true,
  limit: '100mb',
  type: 'application/octet-stream'
};

app.use(bodyParser.raw(rawOptions));

app.use(cookieParser());
app.use(express.static(Path.join(__dirname, 'public')));


//////////////////////////////////////////////////////////////////////////////////////////
// Rate limiting
//////////////////////////////////////////////////////////////////////////////////////////
const rateLimit = require("express-rate-limit");
const apiLimiter = rateLimit({
  windowMs: 24 * 60 * 60 * 1000, // 24 hours
  max: 50
});
 
// only apply to requests that begin with /api/
app.use("/signIn", apiLimiter);

//////////////////////////////////////////////////////////////////////////////////////////
// Photo management
//////////////////////////////////////////////////////////////////////////////////////////
var JSZip = require("jszip");
var request = require('request');
var archiver = require('archiver');

downloadImage = async (uri, filename, callback) => {
  request.head(uri, function(err, res, body){
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};

app.get('/imageDownload', function (req, res) {    
    var organisation = req.query.organisation;  
    var jobRef = req.query.jobRef;             
    res.download('secureFiles/imageZips/' + organisation + '/' + jobRef + '.zip'); 
});

app.post("/downloadImages", async (req, res) => {
  try {
    const requestURL = req.body.requestURL;
    console.log(requestURL)
    const rootDirectory = process.cwd();
    fsExtra.emptyDirSync(`${__dirname}/upload/`);
    const getJsonFile = async () => {
      try {
        const resp = await axios.get(
          `https://res.cloudinary.com/alvari/image/list/${requestURL}`
        );
        return resp.data.resources;
      } catch (e) {
        console.log(e);
        res.status(500).send(e);
      }
    };
    await getJsonFile();
    const createZipFile = async () => {
      const sourceDir = resolve(rootDirectory, "upload");

      let zip = new JsZip();
      buildZipFromDirectory(sourceDir, zip, sourceDir);

      const zipContent = await zip.generateAsync({
        type: "nodebuffer",
        comment: "ser-web-manangement",
        compression: "DEFLATE",
        compressionOptions: {
          level: 9,
        },
      });
      return zipContent;
    };
    const buildZipFromDirectory = (dir, zip, root) => {
      const list = fs.readdirSync(dir);

      for (let file of list) {
        file = path.resolve(dir, file);
        let stat = fs.statSync(file);
        if (stat && stat.isDirectory()) {
          this.buildZipFromDirectory(file, zip, root);
        } else {
          const filedata = fs.readFileSync(file);
          zip.file(path.relative(root, file), filedata);
        }
      }
    };
    const dest = `${__dirname}/upload/`;
    var count = 0;

    let src = await getJsonFile();

    var recursiveDowload = async function (urlArray, i) {
      if (i < urlArray.length) {
        console.log(urlArray[i].public_id);
        request
          .get(
            "https://res.cloudinary.com/alvari/image/upload/" +
              urlArray[i].public_id
          )
          .on("error", function (err) {
            console.log(err);
          })
          .pipe(
            fs.createWriteStream(
              `${__dirname}/upload/` +
                `${urlArray[i].public_id.split("/")[1]}.` +
                urlArray[i].format
            )
          )
          .on("close", function () {
            recursiveDowload(urlArray, i + 1);
          });
      } else {
        const fileer = await createZipFile();
        fsExtra.emptyDirSync(`${__dirname}/upload/`);
        res.setHeader("content-type", "arrayBuffer");
        res.send(fileer);
      }
    };
    recursiveDowload(src, 0);
  } catch (e) {
    console.log(e);
    fsExtra.emptyDirSync(`${__dirname}/upload/`);

    res.status(500).send(e);
  }
});


//////////////////////////////////////////////////////////////////////////////////////////
// Error handling
//////////////////////////////////////////////////////////////////////////////////////////
// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    //err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error.pug', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('error.pug', {
        message: err.message,
        error: {}
    });
});

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept,Authorization"
    );
    next();
});

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function () {
    debug('Express server listening on port ' + server.address().port);
});
//“严格使用”;
var debug=require('debug');
var express=需要(“express”);
var Path=require('Path');
var记录器=需要('morgan');
var cookieParser=require('cookie-parser');
var csrf=需要('csurf');
var bodyParser=require('body-parser');
var http=require(“https”);
var favicon=要求('serve-favicon');
const resolve=require(“路径”).resolve;
var JsZip=require('JsZip');
var fs=需要('fs-extra');
const uuid=require(“uuid”);
var请求=要求(“请求”);
var https=require('https');
常量axios=要求(“axios”);
常量路径=要求(“路径”);
const fsExtra=需要(“fs extra”);
var刮刀=需要(“图像刮刀”);
//环境设置
const currentEnv='PROD'//“PROD”或“DEV”
const cloudinaryFolder='inspectAPP'//“inspectAPP”或“inspectAPP开发”
//设置路由中间件
var csrfProtection=csrf({cookie:true})
var-app=express();
//戴头盔
var头盔=需要(“头盔”);
应用程序使用(
安全政策({
指令:{
defaultSrc:[“'self'”,
scriptSrc:[“'self'”、“'safe-inline'”、“cdnjs.cloudflare.com”、“ajax.googleapis.com”、“maxcdn.bootstrapcdn.com”、“cdn.jsdeliver.net”、“stackpath.bootstrapcdn.com”],
styleSrc:[“'self'”、“unsafe-inline'”、“stackpath.bootstrapcdn.com”、“fonts.googleapis.com”、“cdnjs.cloudflare.com”、“maxcdn.bootstrapcdn.com”、“use.fontsawesome.com”],
imgSrc:[“*”、“'self'”、“cdnjs.cloudflare.com”],
fontSrc:[“*”,“'self'”,“fonts.gstatic.com”],
frameSrc:[“'self'”,“jimmywarting.github.io”],
objectSrc:[“'none'”,
connectSrc:[“'self'”,“res.cloudinary.com”,“cloudinary.com”],
升级不安全请求:[],
},
})
);
应用程序禁用(“x供电”);
//查看引擎设置
//查看引擎设置
app.set('views',Path.join('views');
应用程序集(“查看引擎”、“帕格”);
应用程序使用(favicon(uu dirname+'/public/images/favicon.ico');
应用程序使用(记录器(“开发”);
app.use(bodyParser.urlencoded({
扩展:false
}));
use(bodyParser.json());
//将一些自定义内容解析到缓冲区中
var rawOptions={
膨胀:是的,
限制:“100mb”,
类型:“应用程序/八位字节流”
};
app.use(bodyParser.raw(rawOptions));
使用(cookieParser());
app.use(express.static(Path.join(uu dirname,'public'));
//////////////////////////////////////////////////////////////////////////////////////////
//速率限制
//////////////////////////////////////////////////////////////////////////////////////////
常数费率限制=要求(“明示费率限制”);
常数=速率限制({
windowMs:24*60*60*1000,//24小时
最高:50
});
//仅适用于以/api开头的请求/
应用程序使用(“/sign”,API);
//////////////////////////////////////////////////////////////////////////////////////////
//照片管理
//////////////////////////////////////////////////////////////////////////////////////////
var JSZip=require(“JSZip”);
var请求=要求(“请求”);
var archiver=需要(“archiver”);
downloadImage=async(uri、文件名、回调)=>{
head(uri,函数(err,res,body){
请求(uri).pipe(fs.createWriteStream(filename)).on('close',callback);
});
};
app.get('/imageDownload',函数(req,res){
var Organization=req.query.organization;
var jobRef=req.query.jobRef;
res.download('secureFiles/imageZips/'+organization+'/'+jobRef+'.zip');
});
app.post(“/downloadImages”),异步(req,res)=>{
试一试{
const requestURL=req.body.requestURL;
日志(requestURL)
const rootDirectory=process.cwd();
emptyDirSync(`${uuuu dirname}/upload/`);
const getJsonFile=async()=>{
试一试{
const resp=等待axios.get(
`https://res.cloudinary.com/alvari/image/list/${requestURL}`
);
返回相应的数据资源;
}捕获(e){
控制台日志(e);
资源状态(500)。发送(e);
}
};
等待getJsonFile();
const createZipFile=async()=>{
const sourceDir=resolve(rootDirectory,“upload”);
让zip=newjszip();
buildZipFromDirectory(sourceDir、zip、sourceDir);
const zipContent=await zip.generateAsync({
类型:“nodebuffer”,
评论:“ser网络管理”,
压缩:“放气”,
压缩选项:{
级别:9,
},
});
返回zipContent;
};
const buildZipFromDirectory=(dir,zip,root)=>{
const list=fs.readdirSync(dir);
对于(让列表的文件){
file=path.resolve(dir,file);
让stat=fs.statSync(文件);
if(stat&&stat.isDirectory()){
这个.buildZipFromDirectory(文件、zip、根目录);
}否则{
const filedata=fs.readFileSync(文件);
zip.file(path.relative(root,file),filedata);
}
}
};
const dest=`${uu dirname}/upload/`;
var计数=0;
让src=wait getJsonFile();
var recursiveDowload=异步函数(URLARY,i){
if(i//'use strict';
var debug = require('debug');
var express = require('express');
var Path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var csrf = require('csurf');
var bodyParser = require('body-parser');
var http = require("https");
var favicon = require('serve-favicon');
const resolve = require("path").resolve;
var JsZip = require('jszip');
var fs = require('fs-extra');
const uuid = require("uuid");
var request = require('request');
var https = require('https');

const axios = require("axios");

const path = require("path");
const fsExtra = require("fs-extra");
var Scraper = require("image-scraper");

//ENVIRONMENT SETUP
const currentEnv = 'PROD'; //Either 'PROD' OR 'DEV'
const cloudinaryFolder = 'inspectAPP'; //Either 'inspectAPP' OR 'inspectAPP-dev'

// setup route middlewares
var csrfProtection = csrf({ cookie: true })

var app = express();

//Set up helmet
var helmet = require('helmet');
app.use(
  helmet.contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'", "cdnjs.cloudflare.com", "ajax.googleapis.com", "maxcdn.bootstrapcdn.com", "cdn.jsdelivr.net", "stackpath.bootstrapcdn.com"],
      styleSrc: ["'self'", "'unsafe-inline'", "stackpath.bootstrapcdn.com", "fonts.googleapis.com", "cdnjs.cloudflare.com", "maxcdn.bootstrapcdn.com", "use.fontawesome.com"],
      imgSrc: ["*", "'self'", "cdnjs.cloudflare.com"],
      fontSrc: ["*", "'self'", "fonts.gstatic.com"],
      frameSrc:["'self'","jimmywarting.github.io"],
      objectSrc: ["'none'"],
      connectSrc: ["'self'", "res.cloudinary.com", "cloudinary.com"],
      upgradeInsecureRequests: [],
    },
  })
);
app.disable('x-powered-by');


// view engine setup 
// view engine setup
app.set('views', Path.join(__dirname, 'views'));
app.set('view engine', 'pug');


app.use(favicon(__dirname + '/public/images/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(bodyParser.json());
// parse some custom thing into a Buffer
var rawOptions = {
  inflate: true,
  limit: '100mb',
  type: 'application/octet-stream'
};

app.use(bodyParser.raw(rawOptions));

app.use(cookieParser());
app.use(express.static(Path.join(__dirname, 'public')));


//////////////////////////////////////////////////////////////////////////////////////////
// Rate limiting
//////////////////////////////////////////////////////////////////////////////////////////
const rateLimit = require("express-rate-limit");
const apiLimiter = rateLimit({
  windowMs: 24 * 60 * 60 * 1000, // 24 hours
  max: 50
});
 
// only apply to requests that begin with /api/
app.use("/signIn", apiLimiter);

//////////////////////////////////////////////////////////////////////////////////////////
// Photo management
//////////////////////////////////////////////////////////////////////////////////////////
var JSZip = require("jszip");
var request = require('request');
var archiver = require('archiver');

downloadImage = async (uri, filename, callback) => {
  request.head(uri, function(err, res, body){
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};

app.get('/imageDownload', function (req, res) {    
    var organisation = req.query.organisation;  
    var jobRef = req.query.jobRef;             
    res.download('secureFiles/imageZips/' + organisation + '/' + jobRef + '.zip'); 
});

app.post("/downloadImages", async (req, res) => {
  try {
    const requestURL = req.body.requestURL;
    console.log(requestURL)
    const rootDirectory = process.cwd();
    fsExtra.emptyDirSync(`${__dirname}/upload/`);
    const getJsonFile = async () => {
      try {
        const resp = await axios.get(
          `https://res.cloudinary.com/alvari/image/list/${requestURL}`
        );
        return resp.data.resources;
      } catch (e) {
        console.log(e);
        res.status(500).send(e);
      }
    };
    await getJsonFile();
    const createZipFile = async () => {
      const sourceDir = resolve(rootDirectory, "upload");

      let zip = new JsZip();
      buildZipFromDirectory(sourceDir, zip, sourceDir);

      const zipContent = await zip.generateAsync({
        type: "nodebuffer",
        comment: "ser-web-manangement",
        compression: "DEFLATE",
        compressionOptions: {
          level: 9,
        },
      });
      return zipContent;
    };
    const buildZipFromDirectory = (dir, zip, root) => {
      const list = fs.readdirSync(dir);

      for (let file of list) {
        file = path.resolve(dir, file);
        let stat = fs.statSync(file);
        if (stat && stat.isDirectory()) {
          this.buildZipFromDirectory(file, zip, root);
        } else {
          const filedata = fs.readFileSync(file);
          zip.file(path.relative(root, file), filedata);
        }
      }
    };
    const dest = `${__dirname}/upload/`;
    var count = 0;

    let src = await getJsonFile();

    var recursiveDowload = async function (urlArray, i) {
      if (i < urlArray.length) {
        console.log(urlArray[i].public_id);
        request
          .get(
            "https://res.cloudinary.com/alvari/image/upload/" +
              urlArray[i].public_id
          )
          .on("error", function (err) {
            console.log(err);
          })
          .pipe(
            fs.createWriteStream(
              `${__dirname}/upload/` +
                `${urlArray[i].public_id.split("/")[1]}.` +
                urlArray[i].format
            )
          )
          .on("close", function () {
            recursiveDowload(urlArray, i + 1);
          });
      } else {
        const fileer = await createZipFile();
        fsExtra.emptyDirSync(`${__dirname}/upload/`);
        res.setHeader("content-type", "arrayBuffer");
        res.send(fileer);
      }
    };
    recursiveDowload(src, 0);
  } catch (e) {
    console.log(e);
    fsExtra.emptyDirSync(`${__dirname}/upload/`);

    res.status(500).send(e);
  }
});


//////////////////////////////////////////////////////////////////////////////////////////
// Error handling
//////////////////////////////////////////////////////////////////////////////////////////
// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    //err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error.pug', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('error.pug', {
        message: err.message,
        error: {}
    });
});

app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept,Authorization"
    );
    next();
});

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function () {
    debug('Express server listening on port ' + server.address().port);
});
app.use(bodyParser.json({limit: '100mb'}));
app.use(bodyParser.urlencoded({     
limit: '100mb',
extended: true
}));