Node.js文件上传内存泄漏

时间:2018-08-31 03:14:36

标签: express memory-leaks google-cloud-storage multer sharp

我正在使用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使用率保持一致,并且没有增加太多。但是,由于磁盘存储,目录权限等原因,此方法不是可取的。

感谢您可能提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

我将查看先前问题herehere中提供的建议-不一定是内存泄漏的结果,增加实例类的内存大小可以解决此问题。