Как совместить модель схемы с загрузкой файлов в Node.js и MongoDB? - PullRequest
0 голосов
/ 20 февраля 2019

Добрый день всем, я создаю веб-приложение для хранения информации о сотрудниках в локальной базе данных.Я написал необходимый код, чтобы клиент мог ввести требуемую информацию, такую ​​как имя, адрес электронной почты, номер телефона и т. Д., Через форму и сохранить ее в MongoDB.Теперь я хотел бы добавить функцию загрузки файлов, чтобы документы можно было загружать вместе с информацией о сотрудниках, такой как страховые полисы, копии паспортов и т. Д. Я изо всех сил пытаюсь найти способ реализовать это в виде множества методов, показывающих онлайн-реализации CRUD и файлов.загружает отдельно.Есть ли кто-нибудь опытный, кто сможет предложить подход к реализации?Я новичок в Node dev и не знаком с огромным выбором доступных фреймворков.Пока у меня есть следующие настройки:

Используемые фреймворки: Express, Mongoose, Express-Handlebars (просмотр движка), Bootstrap

employee.Model:

const mongoose = require('mongoose');
const mongoURI = 'mongodb://localhost:27017/testDB'
const conn = mongoose.createConnection(mongoURI, {useNewUrlParser: true});


Schema = mongoose.Schema;
var employeeSchema = new Schema({
    fullName: {
        type: String,
        required: true
    },
    email: {
        type: String
    },
    mobile: {
        type: String
    },
    city: {
        type: String
    }
    });

const Employee = conn.model('Employee', employeeSchema);
module.exports = Employee;

Контролер сотрудника:

const mongoose = require ('mongoose');
const express = require ('express');
var router = express.Router();
const Employee = require('../models/employee.model');

router.post('/', (req, res) => {
    insertRecord(req, res);
});

function insertRecord (req, res) {
var employee = new Employee();
employee.fullName = req.body.fullName;
employee.email = req.body.email;
employee.mobile = req.body.mobile;
employee.city = req.body.city;
employee.save((err, doc) =>{
    if (!err)
        res.redirect('employee/list');
    else {
        console.log('Error during record insertion: ' + err);
    }
});
}

Вид руля:

<h3>{{viewTitle}}</h3>

<form action="/employee" method="POST" autocomplete="off">
    <div class="form-group">
        <label>Full Name</label>
        <input type="text" class="form-control" name="fullName" 
placeholder="Full Name">
    </div>
    <div class="form-group">
        <label>Email</label>
        <input type="text" class="form-control" name="email" 
placeholder="Email">
    </div>
    <div class="form-row">
        <div class="form-group col-md-6">
            <label>Mobile</label>
            <input type="text" class="form-control" name="mobile" 
placeholder="Mobile">
        </div>
        <div class="form-group col-md-6">
            <label>City</label>
            <input type="text" class="form-control" name="city" 
placeholder="City">
        </div>
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-info"><i class="fa fa- 
database"></i> Submit</button>
    </div>
</form>

1 Ответ

0 голосов
/ 20 февраля 2019

Загруженные файлы являются входными данными, как и другие, им просто нужен определенный атрибут enctype="multipart/form-data" на стороне HTML и правильная обработка на сервере.

И простая для понимания демонстрация с использованием Multer (на самом деле основанный на их собственных примерах):

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

const fileUploadMiddleware =  upload.fields({
  {name: 'resume', maxCount: 1},
  {name: 'insurance', maxCount: 4}
});
router.post('/', fileUploadMiddleware, (req, res) => {
  insertRecord(req, res);
});

function insertRecord(req, res) {
  ...
  console.log(req.files.resume[0].mimetype); // this is resume file type
  console.log(req.files.insurance[0].path); // this is first insurance file path
  console.log(req.body.fullName); // this still works
}
...