12

/で書かれたアプリケーションでアップロードされた画像のサイズを変更するためにsharpを使用しています。サイズ変更が成功したら、元のファイルを削除したいと思います。入力画像の場合、操作は正常に終了し、サイズ変更された画像があり、元の画像は削除されます。およびイメージの場合、サイズ変更は成功しますが、コマンドは次のエラーで失敗します。Node.jsExpressTypescriptpnggifjpgtifunlink

EBUSY: リソースがビジーまたはロックされています。リンク解除 '...'

sharp().resize()サイズ変更操作が完了した後でも、入力ファイルをロックしたままにするかのように。

説明した動作をテストするコードは次のとおりです。

import { existsSync, unlinkSync } from "fs";
import { normalize, parse } from "path";

var argv = require("yargs").argv;
var sharp = require("sharp");
var appRoot = require("app-root-path") + "/";

let resizeTest = async function (filename: string): Promise<boolean> {
    try {
        let nameParts = parse(filename);
        let source = appRoot + filename;
        let destination = appRoot + nameParts.name + "_resized" + nameParts.ext;
        let fileExists = await existsSync(source);
        if (!fileExists) {
            console.log("Input file not found. Exiting.");
            return false;
        }

        let resizeResult = await sharp(source)
            .resize(128, 128)
            .toFile(destination);
        console.log("Resize operation terminated: ", resizeResult);

        await unlinkSync(source);
        console.log("unlinkSync operation terminated.");

        return true;
    } catch (error) {
        console.log("An error occured during resizeTest execution: ", error.message);
        return false;
    }
}

if (argv._.length === 0) {
    console.log("Usage: node sharptest.js FILENAME");
} else {
    let resizeResult: Promise<boolean> = resizeTest(argv._[0]);
    resizeResult.then(result => console.log("Returning from execution with ", result));
}

私は何が欠けていますか?

4

2 に答える 2

0

内部では、sharp は (開いている) ファイルのキャッシュを維持し、元のファイルが削除されるのをブロックします。

sharp.cache(false);

上記の行に REST API の先頭を追加します

于 2020-11-16T05:24:57.417 に答える