我正在使用 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...")
})
索引.html
<form action="/upload" enctype="multipart/form-data" method="POST">
<input type="file" name="media">
<input type="submit">
</form>
我还使用 Multer.DiskStorage 进行了测试,RAM 使用率保持一致,几乎没有增加太多。但是,由于磁盘存储、目录权限等原因,这种方法并不可取。
感谢您提供的任何帮助!