Невозможно прочитать свойство 'toString' из неопределенного в multer - PullRequest
0 голосов
/ 25 ноября 2018

Я загружаю текстовый файл, используя multer.Мне нужно получить содержимое текстового файла.Итак, я использую buffer.toString ('utf8').Но он выдает мне сообщение об ошибке, которое выглядит следующим образом: Cannot read property 'toString' of undefined. Кто-нибудь знает, почему это происходит?Также я проверил, что req.file is not undefined

Мой код выглядит следующим образом:

const multer  = require('multer');
const upload = multer({ dest: 'uploads/' });
function setupRoutes(app) {
  //@TODO add appropriate routes

  const base = app.locals.base;
    // app.get(`${base}/search.html`, doSearch(app));
    app.get(`${base}/add.html`, createDocsForm(app));
    app.post(`${base}/add.html`, upload.single('file'), doAdd(app));
    app.get(`${base}/:id`, showContent(app));// must be last
  }

function doAdd(app){
  return async function(req, res) {
    try{
       //console.log(req.file.buffer.toString(`utf8`));
      // if(req.file === undefined) console.log("req is undefined");
      const fileContent = req.file.buffer.toString('utf8');
      // const fileContent = req.file;
      let fileName = req.file.originalname;
      fileName = fileName.substring(0, fileName.lastIndexOf('.'));
      const obj = {
        name: fileName,
        content: fileContent
      }
      const a = await app.locals.model.uploadDoc(obj);
      res.redirect(`${app.locals.base}/${fileName}`);
    }catch(err){
        if(req.file == undefined){
          const err = "Select file to upload";
          const model = {base:app.locals.base, err:err};
          const html = doMustache(app,'add',model);
          res.send(html);
        }
        else{
          const errors= wsErrors(err);
          const model = {base:app.locals.base, errors:errors};
          const html = doMustache(app,'add',model);
          res.send(html);
        }
   } }
}

1 Ответ

0 голосов
/ 25 ноября 2018

У вас есть конфликтующий код:

const upload = multer({ dest: 'uploads/' });

Если вы хотите file.buffer, вам нужно импортировать без dest, например:

const upload = multer({});

Ваш импорт подразумевает DiskStorage, но multer определяет buffer только для файлов, использующих MemoryStorage:

function Multer (options) {
  if (options.storage) {
    this.storage = options.storage
  } else if (options.dest) {
    this.storage = diskStorage({ destination: options.dest })
  } else {
    this.storage = memoryStorage()
  }

  this.limits = options.limits
  this.preservePath = options.preservePath
  this.fileFilter = options.fileFilter || allowAll
}

См. код выбора хранилища мультера и MemoryStorage .


При достаточном количестве операций вы могли бы мультиплексировать хранилища, возможно, написав свой собственный композитный мультиплексор хранения:

class StorageMultiplexer {
    constructor(...storageBackends) {
        this._storages = storageBackends;
    }

    _handleFile(req, file, cb) {
        this._storages.forEach(s => s._handleFile(req, file, cb));
    }

    _removeFile(req, file, cb) {
        this._storages.forEach(s => s._removeFile(req, file, cb));
    }
}

var diskStorage = require('./storage/disk')
var memoryStorage = require('./storage/memory')

const upload = multer({
    dest: 'uploads/',
    storage: new StorageMultiplexer(diskStorage, memoryStorage)
});

Этот код не тестировался и является просто демонстрацией

Пожалуйста, прочитайте StorageEngine.md для получения дополнительной информации.

...