Причина ошибки записи EPIPE в моей реализации? - PullRequest
0 голосов
/ 18 мая 2019

В настоящее время у меня есть небольшое приложение node.js express для загрузки изображений с использованием резких изображений и миниатюр, созданных из видео .mp4 с использованием пакета simple-thumbnail / ffmpeg.

Приложение отлично работает при загрузке изображения, файлазагружается острыми процессами, затем передает его, и он, как и ожидалось, попадает в мое ведро amazon s3.Никаких ошибок, что когда-либо.

Однако, когда я загружаю видео в формате mp4, которое я использую для создания и загрузки миниатюр, используя функцию genThumbnail () simple-thumbnails, которая использует дочерний процесс ffmpeg, миниатюра успешно загружается в мое хранилище s3 , ОДНАКО мое приложение возвращает ошибка записи EPIPE , а НЕ URL-адрес URL загруженных файлов на S3.

Что вызывает это и как это можетЯ исправляю это, учитывая, что это в значительной степени работает помимо возвращаемой ошибки EPIPE?Спасибо вперед!

Используемые пакеты:

aws-sdk

multer

multer-s3 <- этот с опцией преобразования, <strong>не стандартный пакет multer-s3

простая миниатюра

const express = require('express');
const app = express();

const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3'); //github:gmenih341/multer-s3 version of multer-s3 with transform option
const sharp = require('sharp');
const genThumbnail = require('simple-thumbnail');

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Orgin, X-Requested-With, Content-Type, Accept, Authorization');
    if (req.method === 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'POST');
        return res.status(200).json({});
    }
    next();
});

let uniqueFileName;
let s3BucketName = 'bucketname';

let s3 = new aws.S3({
    accessKeyId: ACCESS_KEY,
    secretAccessKey: SECRET_KEY,
    Bucket: s3BucketName
});

let upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: s3BucketName,
        acl: 'public-read',
        cacheControl: 'max-age=31536000',
        contentType: multerS3.AUTO_CONTENT_TYPE,
        shouldTransform: true,
        transforms: [{
            id: 'thumbnail',
            key: function (req, file, cb) {
                uniqueFileName = Date.now().toString();
                cb(null, uniqueFileName + '.jpg')
            },
            transform: function (req, file, cb) {
                if (file.mimetype == 'video/mp4') {
                    //When using simple-thumbnails' getThumbnail() on an mp4 video it uploads succesfully to S3 but node returns EPIPE write error
                    cb(null, genThumbnail(null, null, '250x?'))
                } else {
                    //When using sharp to resize an image this works perfectly and retuns the JSON below with the files S3 URL
                    cb(null, sharp().jpeg())
                }

            }
        }]
    })
});

app.post('/upload', upload.array('theFile'), (req, res) => {
    res.json({
        fileS3Url: 'https://s3.amazonaws.com/'+ s3BucketName +'/' + uniqueFileName
    });
});

app.use((req, res, next) => {
    const error = new Error('Not found');
    error.status = 404;
    next(error);
});

app.use((error, req, res, next) => {
    res.status(error.status || 500);
    res.json({
        error: {
            message: error.message
        }
    });
});

module.exports = app;
...