требование не определено после отправки формы muti-image из углового - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь отправить форму из Angular 7 с текстом и изображениями на серверную часть узла, используя Multer в качестве промежуточного программного обеспечения и Express.json () в качестве моего bodyParser.Данные формы находятся в представлении веб-интерфейса, а текстовые данные - в бэкэнде, но поля изображения пусты {}.Я пытался использовать bodyParse.json (), и результаты те же.

Вот мой файл app.js

const express = require('express');
// const bodyParser = require('body-parser');
const adminController = require('./controllers/admin');
const path = require('path');
const cors = require('cors')
const app = express()
const FORM_URLENCODED = 'multipart/form-data';
app.use(cors())

... my mongodb connection string ...

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, X- Auth-Token')
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS')
  next();
});

// const bp = bodyParser.json()
// console.log('TCL: bp', bp);
app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(express.static(path.join(__dirname, 'images')));

// req is not defined?!?!?!?!?
app.use(() => {
  if (req.headers['content-type'] === FORM_URLENCODED) {
    let body = '';
    req.on('data', chunk => {
        body += chunk.toString(); // convert Buffer to string
    });
    req.on('end', () => {
        console.log(body);
        res.end('ok');
    });
  }
})

// -- multer
const multer = require('multer');
const crypto = require("crypto");
const imgDir = 'images';

const imgStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'images')
  },
  filename: function(req, file, callback) {
    crypto.pseudoRandomBytes(16, function(err, raw) {
      if (err) return callback(err);
      callback(null, raw.toString('hex') + 
path.extname(file.originalname));
    });
  }
});

const fileFilter = ((req, file, cb) => {
  // accept image only
  if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
    return cb(new Error('Only image files are allowed!'), false);
  }
  cb(null, true);
});

const upload = multer({dest: imgDir, storage: imgStorage, fileFilter: 
fileFilter, limits: {fileSize: 16000} }).array('image',20);

// app.use(
//   upload.fields([
//     { name: 'mainImg', maxCount: 1 },
//     { name: 'image', maxCount: 5 },
//   ])
// );
// -- end multer

app.post('/admin/add-product', function (req, res, next) {
  var path = '';
  upload({dest: imgDir, storage: imgStorage, fileFilter: fileFilter, 
limits: {fileSize: 16000} });
    path = req.file.path;

/// path is not defined!?!?!?!?

    return res.send("Upload Completed for "+path);
}, adminController.postAddProduct);

const userRoutes = require('./routes/user');
app.use('/user', userRoutes);

module.exports = multer;
module.exports.imgStorage = imgStorage;
module.exports = app;

Угловая форма

<form [formGroup]="prodForm" (ngSubmit)="onSubmit()" enctype="multipart/form-data">
<div class="col-md-4">
      <label for="title"> <span class="required">*</span>Title: </label>
      <mat-form-field>
        <input class="form-control" matInput type="text" formControlName="title" #prodTitle />
        <mat-error *ngIf="prodForm.get('title').invalid">Please enter a title</mat-error>
      </mat-form-field>
    </div>
<div class="col-md-4">
      <div class="col-md-5">
        <button class="btn btn-success" mat-stroked-button type="button" (click)="filePicker.click()">
          Pick Image
        </button>
        <input type="file" #filePicker name="image" (change)="onImagePicked($event)" />
      </div>

      <div class="image-preview col-md-7" *ngIf="imgSrc !== '' && imgSrc">
        <img [src]="imgSrc" alt="{{ prodTitle.value }}" />
      </div>
    </div>

    <div class="col-md-12 sectButtons">
      <button class="btn btn-success" (click)="onShowStep2()">Next Step</button>
      <div class="clear"></div>
    </div>

Угловая форма вывода

image: File {name: "some-image.jpg", lastModified: 1552012800142, 
lastModifiedDate: Thu Mar 07 2019 21:40:00 GMT-0500 (Eastern Standard Time), webkitRelativePath: "", size: 42381, …}
title: "some title"

Выход контроллера узла

TCL: exports.postAddProduct -> req.body { _id: '',
  title: 'some title',
  image: {}, }
TCL: exports.postAddProduct -> files undefined

Чего мне не хватает?Я потратил слишком много времени, пытаясь понять это.

1 Ответ

0 голосов
/ 19 апреля 2019

req не определено, потому что вы не определили объект req.Это не действительный экспресс middleware.изменить на

// next is optional
app.use((req, res, next) => {
  if (req.headers['content-type'] === FORM_URLENCODED) {
    let body = '';
    req.on('data', chunk => {
      body += chunk.toString(); // convert Buffer to string
    });
    req.on('end', () => {
      console.log(body);
      res.end('ok');
    });
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...