首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个对Node服务器的请求挂起了?

为什么这个对Node服务器的请求挂起了?
EN

Stack Overflow用户
提问于 2015-10-31 22:57:26
回答 3查看 10.9K关注 0票数 1

我对express和node非常陌生。我试着用多方和code given here上传图片。我已经检查了文件大小。当我上传的文件大小超过限制时,它会出现在"problem section“中。问题是服务器挂起,只有在请求超时后才会响应。我已经尝试了许多堆栈溢出的解决方案,但似乎都不起作用。如果文件大小低于限制,则会起作用。我非常确定代码到达了问题部分,并且上传逻辑没有问题。但似乎我必须在“问题部分”做一些事情。请告诉我我漏掉了什么。

我已经用next(),res.send(),res.end(),next(err),return替换了问题部分中的代码;但它不起作用。无论发生什么,它都会挂起。

代码如下:

代码语言:javascript
复制
router.post("/image", function(req, res, next) {
  if(req.user) {
    upload.uploadToS3(req, S3_BUCKET, S3_PROFILE_IMAGE_FOLDER, function(result) {
      if(result.error != null && result.error === false) {
        models.Customer.update({
          orignalImage : result.fileLocation
        },{
          where : { mobileNumber : req.user.mobileNumber}
        }).then(function(customer) {
          if(customer) {
            res.send({
              url: result.fileLocation,
              error : false
            });
          } else {
            res.status(400);
            res.send({error : true,
              error_message : 'Image upload failed'});
          }
        });
      } else {
        //PROBLEM SECTION
        res.status(404);
        res.json({error : true, error_message : result.error_message});
      }
    });
  } else {
    res.status(403);
    res.send({message: "access denied"});
  }
});

response after timeout

请告诉我,如果你需要更多的细节,我会上传它。var uploadToS3 = function(req,S3_BUCKET,folder,callback) { var s3Client = knox.createClient({ secure: false,key: awsConfig.accessKeyId,secret: awsConfig.secretAccessKey,bucket: S3_BUCKET,});

代码语言:javascript
复制
  var headers = {
    'x-amz-acl': 'public-read',
  };

  var form = new multiparty.Form();
  var batch = new Batch();

  batch.push(function(cb) {
    form.on('part', function(part) {
      var validity = validateFile({type : part.headers['content-type'], name : part.filename, length : part.byteCount});
      console.log(validity);
      if(validity.isValid) {
        cb(null, { filename : folder+"/"+generateFileName({name : part.filename}), part : part});  
      } else {
        cb({error : true, error_message : validity.reason, part:part }, "advra kedavra");
      }
    });
  });

  batch.end(function(err, results) {

    if (err) {
      console.log(err);
      err.statusCode = 200;
      callback(err);
    } else {
      form.removeListener('close', onEnd);
      var result = results[0];
      var part = result.part;
      var destPath = result.filename;
      var counter = new ByteCounter();
      part.pipe(counter); // need this until knox upgrades to streams2
      headers['Content-Length'] = part.byteCount;
      s3Client.putStream(part, destPath, headers, function(err, s3Response) {
        result = {};
        if(err) {
          console.log(err);
          result.error = true;
          result.error_message = "Problem in uploading!";
        } else {
          console.log(s3Response.req.url);
          result = {error: false, statusCode : s3Response.statusCode, message : "file upload successful.", fileLocation : s3Response.req.url};
        }   
        callback(result);
      });
      part.on('end', function() {
        console.log("File upload complete", counter.bytes);
      });
    }
  });
  function onEnd() {
    console.log("no uploaded file");
    callback({error:false, error_message:"no uploaded file."});
  }
  form.on('error', function(err) {
    console.log('Error parsing form: ' + err.stack);
  });
  form.on('close', onEnd);
  form.parse(req);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-03 02:13:30

经过3天的寻找,我找到了一个答案。Express.js close response

问题部分应如下所示:

代码语言:javascript
复制
res.status(400);
res.set("Connection", "close");
res.json({error:true, error_message : "<some - error message>"});
票数 5
EN

Stack Overflow用户

发布于 2019-04-04 11:53:25

您只需在将状态设置为:res.status(400).end();之后添加一个.end()

See official docs

res.end(data)

结束响应过程。这个方法实际上来自节点核心,特别是http.ServerResponse的response.end()方法。

用于快速结束没有任何数据的响应。如果需要使用数据进行响应,请改用res.send()和res.json()等方法。

res.end();

res.status(404).end();

票数 2
EN

Stack Overflow用户

发布于 2015-11-03 02:39:33

代码语言:javascript
复制
    res.status(400);
    res.set("Connection", "close");
    res.json({error:true, error_message : "<some - error message>"});

我不确定这解决了你的问题。“问题部分”在您的回调中,只有在upLoadToS3函数运行之后才会运行。“问题”可能出在这个函数上。你可能需要重构它来处理大文件上传。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33452952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档