我是表达和节点的新手。我试图使用multiparty和code given here上传图片。 我已经检查了文件大小。当我上传大小超过限制的文件时,它会出现在“问题部分”中。问题是服务器挂起并仅在请求超时后响应。我已经尝试了许多堆栈溢出的解决方案,但似乎没有任何工作。如果文件大小低于限制,它可以工作。我非常确定代码到达问题部分并且上传逻辑没有问题。但似乎我必须在“问题部分”做一些事情。请告诉我我错过了什么。
我已经用问题部分替换了代码 next(),res.send(),res.end(),next(err),return;但它不起作用。它无论如何都会挂起。
以下是代码:
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"});
}
});
如果您需要更多详细信息,请告诉我,我会将其上传。 var uploadToS3 = function(req,S3_BUCKET,folder,callback){ var s3Client = knox.createClient({ 安全:错误, key:awsConfig.accessKeyId, 秘密:awsConfig.secretAccessKey, 斗:S3_BUCKET, });
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);
}
答案 0 :(得分:2)
经过3天的搜索,我找到了一个答案。 Express.js close response
问题部分应如下:
res.status(400);
res.set("Connection", "close");
res.json({error:true, error_message : "<some - error message>"});
答案 1 :(得分:1)
res.status(400);
res.set("Connection", "close");
res.json({error:true, error_message : "<some - error message>"});
我不确定这会解决您的问题。问题部分&#39;在你的回调中,它只会在upLoadToS3函数运行后运行。问题&#39;可能有这个功能。您可能必须重构它以处理大型文件上载。
答案 2 :(得分:0)
将状态设置为SELECT
studentledger.ledgerno,
SUM(case when studentledger.amount>0 then studentledger.amount end) AS payables
Sum(case when studentledger.amount<0 then studentledger.amount end) AS paymentsmade
FROM
studentledger
WHERE
studentledger.period = '1'
GROUP BY
studentledger.ledgerno
having paymentsmade != 0 or paymentsmade < 0
.end()
。
res.end([数据] [,编码])
结束响应过程。该方法实际上来自Node核心,特别是http.ServerResponse的response.end()方法。
用于快速结束没有任何数据的响应。如果您需要对数据进行响应,请使用诸如res.send()和res.json()之类的方法。
res.status(400).end();
res.end();