Значения свойства name не отправляются в форму при наличии свойства enctype ie (s) (Express, Mon go, Node) - PullRequest
0 голосов
/ 18 апреля 2020

РЕДАКТИРОВАТЬ: Я ВОСПОЛЬЗОВАЛСЯ ВО ВРЕМЯ И НАЙДЕН, ЧТО СБРОС СОБСТВЕННОСТИ ЕНТИПА позволил отправлять данные. Я думаю, мой новый вопрос будет звучать так: «Как мне преодолеть эту проблему, заключающуюся в том, что энтайп блокирует отправку моих данных?»

В настоящее время я подаю заявку и работаю над ней. создать маршрут.

Проблема, с которой я сталкиваюсь, заключается в том, что информация из формы, над которой я работаю, не отправляет информацию из тегов "name" на маршрут создания.

Вот схема для упражнений :

const   mongoose    = require('mongoose'), 
        User        = require('./user');

const exerciseSchema = new mongoose.Schema({
    name: { 
        type: String, 
        required: "This field cannot be left blank"
    }, 
    image: String, 
    imageId: String, 
    description: String, 
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId, 
            ref: "User"
        },
        username: String
    }, 
    comments: [
        {
            type: mongoose.Schema.Types.ObjectId, 
            ref: "Comment"
        }
    ], 
    slug: {
        type: String, 
        unique: true, 
        trim: true
    }, 
    recommends: [
        {
            type: mongoose.Schema.Types.ObjectId, 
            ref: "User"
        }
    ], 
    reference:[{
        authors:String,  
        year: String, 
        title: String, 
        journal: String, 
        edition: String, 
        pageStart: Number,
        pageEnd: Number
    }], 
    muscle: String
});

exerciseSchema.pre('save', async function(next){
    try{
        if(this.isNew || this.wasNew){
            this.slug = await generateUniqueSlug(this._id, this.name); 
        }
        next();
    } catch(err){
        console.log(err.message); 
    }
});

var Exercise = mongoose.model("Exercise", exerciseSchema); 
module.exports = Exercise; 

async function generateUniqueSlug(id, exerciseName, slug){
    try{
        if(!slug){
            return slug = slugify(exerciseName); //added return   
        }
        var exercise = await Exercise.findOne({slug:slug}); 
        if(!exercise || exercise._id.equals(id)){
            return slug; 
        }
        var newSlug = slugify(exerciseName); 
        return await generateUniqueSlug(id, exerciseName, newSlug); 
    } catch(err){
        console.log(err.message); 
    }
}

function slugify(text){
    var slug = text
    .toString()
    .toLowerCase()
    .replace(/\s+/g, '-')        // Replace spaces with -
    .replace(/[^\w\-]+/g, '')    // Remove all non-word chars
    .replace(/\-\-+/g, '-')      // Replace multiple - with single -
    .replace(/^-+/, '')          // Trim - from start of text
    .replace(/-+$/, '')          // Trim - from end of text
    .substring(0, 75);           // Trim at 75 characters
    return slug + "-" + Math.floor(1000 + Math.random() * 9000) //Add 4 random digits to improve uniqueness
}

module.exports = mongoose.model('Exercise', exerciseSchema);

Ниже приведен маршрут создания:

router.post('/', (req, res)=>{
    Exercise.create(req.body.exercise, (err, newlyCreate)=>{
        if(err){
            console.log(req.body.exercise); //undefined
            return res.redirect("back");  
        }
        console.log(newlyCreate); 
        res.redirect("/exercises"); 
    }); 
}); 

Наконец, ниже приведена форма для создания упражнений пользователями:

<div class="row">
    <form class="w-75 m-auto" action="/exercises" method="POST" enctype="multipart/form-data">
        <div class="form-group">
            <label>Name</label>
            <input class="form-control" type="text" name="exercise[name]">
        </div>
        <div class="form-group">
            <label for="image">Images</label>
            <input type="file" name="image" id="image" accept="image/*"> 
        </div>
        <div class="form-group">
            <label>Description</label>
            <textarea class="form-control" name="exercise[description]" rows=5 placeholder="Provide detail about the type of population, what you're targeting, cues, and the usefullness of this exercise..."></textarea>
        </div>
        <div class="form-group">
            <label for="muscle">Primary muscle targeted</label>
            <select class="form-control" name="exercise[muscle]" id="muscle">
                <option>Soleus</option>
                <option>Gastrocnemius</option>
                <option>Tibialis Anterior</option>
                <option>Sartorius</option>
            </select>
        </div>
            <div id="references">
                <!-- References will go here -->
            </div>
            <a class="newRef" href="#">Add Reference</a>
        <div class="form-group">    
            <input class="btn btn-primary w-100" id="submitExercise" type="submit" value="Submit">
        </div>
    </form> 
</div>


<a href="/exercises">Go back</a>



<script>
    var newRefButton = document.querySelector('.newRef');
    var references  = document.querySelector('#references');
    var ref = document.querySelector('.reference-group');  
    var list = 0    
    newRefButton.addEventListener('click', ()=>{
        var div = document.createElement('div');
        div.innerHTML = `
            <div class="form-group">
                <input type="text" name="exercise[reference][${list}][authors]" placeholder="Surname, Initials., Surname, Initials., Surname, Inials." class="form-control authorName">
            </div>
            <div class="form-group">
                <input type="text" name="exercise[reference][${list}][title]" placeholder="Title of Article" class="form-control">
            </div>
            <div class="form-group">   
                <input type="text" name="exercise[reference][${list}][journal]" placeholder="Journal" class="form-control">
            </div>
            <div class="form-row">
                <div class="form-group col-md-3">
                    <input type="text" name="exercise[reference][${list}][year]" placeholder="Year" class="form-control">
                </div>
                <div class="form-group col-md-3">
                    <input type="number" name="exercise[reference][${list}][edition]" placeholder="Edition" class="form-control">
                </div>
                <div class="form-group col-md-3">
                    <input type="number" name="exercise[reference][${list}][pageStart]" placeholder="Start Page" class="form-control"> 
                </div>
                <div class="form-group col-md-3">
                    <input type="number" name="exercise[reference][${list}][pageEnd]" placeholder="End Page" class="form-control">
                </div>
            </div>
        `; 
        references.appendChild(div);
        list++ 
    }); 
</script>
  • Я установил bodyParser (последняя версия) и правильно получаю информацию из другой формы.
...