我正在使用Node.js和Express创建一个API。当用户上传文件时,服务器会使用sharp
图像处理库对其进行更改,然后将其上传到Google Cloud Storage存储桶。即使运行手动垃圾收集,节点进程的RAM使用量也会随着上载文件的大小而增加,并且永远不会减少。当没有剩余的RAM分配时,服务器崩溃。
这是问题的重制:
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进行了测试,RAM使用率保持一致,并且没有增加太多。但是,由于磁盘存储,目录权限等原因,此方法不是可取的。
感谢您可能提供的任何帮助!