Node.js应用程序性能
问题描述:
我目前有一个坐在Azure上的node.js脚本,它通过下载URL链接获取文件并通过base64对其进行编码,然后将此base64编码文件发送回请求源。我遇到的问题是基于性能的。下面的脚本在某些情况下通过运行时间超过30秒来超时一个单独的应用程序。其中一个超时问题的文件大小小于MB。有任何想法吗?Node.js应用程序性能
脚本:
const express = require('express');
const bodyParser = require('body-parser');
const https = require('https');
const fs = require('fs');
const request = require('request');
const util = require('util');
const port = process.env.PORT || 3000;
var app = express();
app.use(bodyParser.json());
app.post('/base64file', (req, res) => {
var fileURL = req.body.fileURL;
var listenerToken = req.body.listenerToken;
var testingData = {
fileURL: fileURL,
listenerToken: listenerToken
};
/*
Make sure correct token is used to access endpoint..
*/
if(listenerToken !== <removedforprivacy>) {
res.status(401);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ error: 'You are not authorized'}));
} else if (!fileURL){
res.status(400);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ error: 'The request could not be understood by the server due to malformed syntax.'}));
} else {
https.get(fileURL, function(response) {
var data = [];
response.on('data', function(chunk) {
data.push(chunk);
}).on('end', function() {
//build the base64 endoded file
var buffer = Buffer.concat(data).toString('base64');
//data to return
var returnData = {
base64File: buffer
};
if(buffer.length > 0) {
res.setHeader('Content-Type', 'application/json');
res.status(200);
res.send(JSON.stringify(returnData));
} else {
res.setHeader('Content-Type', 'application/json');
res.status(404);
res.send(JSON.stringify({ error: 'File URL not found.'}));
}
});
});
}
});
app.listen(port, () => {
console.log('Server is up and running ' + port);
});
答
一个想法:你缺少的错误处理。
如果您在https.get()
上遇到错误,您将永远不会发送回复,并且原始请求会超时。
一个想法:你错过了错误处理。如果你在'https.get()'上得到一个错误,你将永远不会发送一个响应,并且原始请求会超时。 – jfriend00
@ jfriend00我会检查你的建议作为解决方案 - 这就是它。随意张贴下面,我会添加它作为答案 – RH8765