Обновление маршрута не работает для параметров объединенного экспресс-маршрутизатора - PullRequest
0 голосов
/ 01 ноября 2019

Я изучаю стек MERN и столкнулся с проблемой на маршруте редактирования моего дочернего маршрутизатора.

У меня есть следующие схемы моделей в songs.js и students.js файлах:

const mongoose = require('mongoose');

const studentSchema = mongoose.Schema({
    name: { type: String, required: true },
    instrument: String,
    songs: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Song'
    }]
});

const Student = mongoose.model('Student', studentSchema);
module.exports = Student;
const mongoose = require('mongoose');

const songSchema = mongoose.Schema({
    name: { type: String, required: true },
    img: String
})

const Song = mongoose.model('Song', songSchema);
module.exports = Song

И у меня есть файлы songs.js и students.js для моих роутеров, а для mergeParams установлено значение true для роутера моих песен const songs = express.Router({ mergeParams: true });. Я присоединяю его к роутеру студентов следующим образом:

students.use('/:id/songs', songs);

например, мои параметры URL становятся students/student1/songs/song1

Все остальные мои маршруты работают, но на маршруте обновленияроутер моих песен Я получаю сообщение об ошибке «Ошибка типа: Student.findById не является функцией», когда я перенаправляю обратно в индексный просмотр песни. Мои маршруты редактирования и обновления приведены ниже:

songs.get('/:songId/edit', async (req, res) => {
    try {
        const findSong = Song.findById(req.params.songId);
        const findStudent = Student.findById = (req.params.id);
        const [foundSong, foundStudent] = await Promise.all([findSong, findStudent]);
        res.render('songs/edit', {
            student: foundStudent,
            song: foundSong
        })
    } catch (err) {
        console.log(err);
    }
});

songs.put('/:songId', async (req, res) => {
    try {
        const updateSong = await Song.findByIdAndUpdate(req.params.songId, req.body, { new: true });
        res.redirect('/students/' + req.params.id + '/songs');
    } catch (err) {
        console.log(err);
    }
});

Я не уверен, что является причиной ошибки здесь, мой маршрут удаления настроен аналогично и работает. Буду признателен за любые предложения.

1 Ответ

0 голосов
/ 01 ноября 2019

В вашем роте (req.params.id) нет определения.

songs.get('/:songId/edit', async (req, res) => {
    try {
        const findSong = Song.findById(req.params.songId);
        **const findStudent = Student.findById = (req.params.id);**
        const [foundSong, foundStudent] = await Promise.all([findSong, findStudent]);
        res.render('songs/edit', {
            student: foundStudent,
            song: foundSong
        })
    } catch (err) {
        console.log(err);
    }
});
...