Я создаю API с Node.js и Express. Когда пользователь загружает файл, сервер изменяет его с помощью библиотеки обработки изображений sharp
, а затем загружает его в корзину Google Cloud Storage. Использование ОЗУ процессом узла увеличивается на размер загружаемого файла и никогда не уменьшается, даже если выполняется сборка мусора вручную. Когда ОЗУ не осталось для выделения, сервер падает.
Вот воспроизведение проблемы:
index.js
const express = require('express')
const GCS = require('@google-cloud/storage')
const Multer = require('multer')
const sharp = require('sharp')
const upload = Multer({ storage: Multer.MemoryStorage, })
const storage = new GCS({
projectId: 'myProject',
keyFilename: './key.json'
}).bucket('myBucket')
const app = express();
app.get("/", (req, res) => {
res.sendFile(__dirname + '/index.html')
})
app.post("/upload", upload.single('media'), (req, res) => {
console.log(req.file)
sharp(req.file.buffer).rotate().resize(1920, 1920).toBuffer().then(b => {
const fileUpload = storage.file('test/' + Date.now())
const fileStream = fileUpload.createWriteStream({
metadata: {
contentType: req.file.mimetype
},
resumable: false
});
fileStream.on('error', (err) => {
console.log(err)
res.send("Server Error")
});
fileStream.on('finish', () => {
fileUpload.makePublic().then(() => {
res.send("DONE")
})
})
fileStream.end(b)
}).catch(e => {
console.log(e)
res.send("Server Error")
})
})
app.listen(3000, () => {
console.log("Server is running...")
})
index.html
<form action="/upload" enctype="multipart/form-data" method="POST">
<input type="file" name="media">
<input type="submit">
</form>
Я также провел тест с использованием Multer.DiskStorage, и использование ОЗУ оставалось неизменным и почти не увеличивалось. Однако этот метод не является предпочтительным из-за дискового пространства, прав доступа к каталогу и т. Д.
Я ценю любую помощь, которую вы можете предложить!