Запрос зависает при загрузке с использованием multer, если он заключен в другую функцию - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь загрузить изображение, используя multer и multers3. Я завернул загрузку Multer в другую функцию. Вместо того, чтобы звонить multer прямо. Эта функция называется. как показано ниже.

FileHandler. js

var multer = require('multer');
var multerS3 = require('multer-s3');
var fs = require('fs');
var AWS = require('aws-sdk');

AWS.config.update({
  endpoint: new AWS.Endpoint('something.digitaloceanspaces.com'),
  accessKeyId: 'something',
  secretAccessKey: 'something'
});


var spacesHandler = function(){
    // Configure client for use with Spaces
    this.s3 = new AWS.S3();
}
spacesHandler.prototype.uploadFiles = function (req, res, cb) {
    var self = this;
    // var item = req.body;
    var upload = multer({
        storage: multerS3({
            s3: self.s3,
            bucket: 'prod.bucket1'  /*req.params.bucketName*/,
            acl: 'public-read',
            contentType: multerS3.AUTO_CONTENT_TYPE,
            metadata: function (req, file, cb) {
                cb(null, { fieldName: file.fieldname });
            },
            key: function (req, file, cb) {
                cb(null, Date.now().toString()+'-'+file.originalname)
            }
        })
    }).single();
    upload(req, res, cb);
};

Итак, этот файл возвращает функцию конструктора. Который имеет uploadFiles метод на своем прототипе. приложение. js

var express = require('express');

var path = require('path');

var favicon = require('serve-favicon');

var logger = require('morgan');

var cookieParser = require('cookie-parser');

var bodyParser = require('body-parser');

var upload = require('./DO-Spaces-Plugin/FileHandler'); //upload is a constructor here

upload = new upload; // upload is a new object here which has uplodFiles method on its protoype

var app = express();


app.use(upload.uploadFiles, function(req, res){

  return res.send('File uploaded!')

});


Не работает, запрос висит на uploadFiles.
Я думаю, что есть что-то с обратным вызовом внутри uploadFiles.
cb похоже на следующее, которое передается upload(req, res, cb).
Я думаю, что запрос не передается следующее промежуточное ПО (функция обработчика маршрута).
Буду признателен за любую помощь, спасибо.

1 Ответ

1 голос
/ 12 февраля 2020

Поскольку вы используете this context, вам, вероятно, нужно определить этот контекст, а не просто передавать ссылку на функцию.

app.use(upload.uploadFiles.bind(upload), ...

Другой способ, в вашем случае, будет возврат завернутая upload функция:

app.use(upload.uploadFiles(), ... // notice we _call_ the function here

// in your middleware file, last line of spacesHandler.prototype.uploadFiles:
return upload; // notice we _return_ the function _itself_ (i.e. not called, so this _is_ our middleware)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...