在node.js / express中构建服务的最佳方法?

问题描述 投票:0回答:1

我开始将逻辑从快递应用程序中的路由转移到服务提供商中。这些路由之一处理流,不仅如此,一旦流完成,还需要执行更多逻辑。这是快速路线的示例。

router.get("/file-service/public/download/:id", async(req, res) => {

try {

    const ID = req.params.id;

    FileProvider.publicDownload(ID, (err, {file, stream}) => {

        if (err) {

            console.log(err.message, err.exception);
            return res.status(err.code).send();

        } else {

            res.set('Content-Type', 'binary/octet-stream');
            res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"');
            res.set('Content-Length', file.metadata.size);

            stream.pipe(res).on("finish", () => {

                FileProvider.removePublicOneTimeLink(file);

            });
        }
    })

} catch (e) {
    console.log(e);
    res.status(500).send(e);
} 

})

这是服务提供者内部的功能之一。

this.publicDownload = async(ID, cb) => {

    const bucket = new mongoose.mongo.GridFSBucket(conn.db, {
        chunkSizeBytes: 1024 * 255,
    })

    let file = await conn.db.collection("fs.files")
    .findOne({"_id": ObjectID(ID)})

    if (!file|| !file.metadata.link) {

        return cb({
            message: "File Not Public/Not Found",
            code: 401,
            exception: undefined
        })

    } else {

        const password = process.env.KEY;
        const IV = file.metadata.IV.buffer

        const readStream = bucket.openDownloadStream(ObjectID(ID))

        readStream.on("error", (e) => {
            console.log("File service public download stream error", e);
        })

        const CIPHER_KEY = crypto.createHash('sha256').update(password).digest()        

        const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV);

        decipher.on("error", (e) => {
            console.log("File service public download decipher error", e);
        })

        cb(null, {
            file, 
            stream: readStream.pipe(decipher)
        })
    } 

}

因为将res或req传递给服务提供者是不明智的(我猜是因为进行单元测试)。我必须返回回调中的流,然后从那里将流传输到响应中,并添加完成事件,以删除文件的一次性下载链接。有没有办法在不传递res / req的情况下将更多这种逻辑移到服务提供者中?还是我全都错了?

javascript node.js rest express
1个回答
0
投票

有没有办法在不传递res / req的情况下将更多这种逻辑移到服务提供者中?

热门问题
推荐问题
最新问题