0

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

感谢您提供的任何帮助!

4

1 回答 1

0

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

于 2018-08-31T12:37:18.240 回答