Как сохранить данные, когда вы пытались ссылаться на схему - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь сохранить информацию из книги, которая содержит в своем эшеме автора и жанр, на который она ссылается в разных файлах.

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

book.js

   const mongoose = require('mongoose');

const bookSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  author: {
    type: mongoose.Schema.ObjectId,
    ref: 'Author', 
  },
  numberInStock: {
    type: Number,
    default: 0,
  },
  image: {
    type: String,
    default: '/path/to/default/image.png',
  },
  genre: {
    type: mongoose.Schema.ObjectId,
    ref: 'Genre',  
  },
});


module.exports = mongoose.model('Books', bookSchema);

author.js

const mongoose = require('mongoose');


const authorSchema = new mongoose.Schema({
  name: String,
  publicatons: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Book',
  }],
});


module.exports = mongoose.model('Author', authorSchema);

createBook.ejs

<div class="container h-100">
    <div class="row">
        <div class="col-lg-6 col-md-offset-3">
            <h1>Add a New Book</h1>
            <form action="/books/new/create" method="post">
                <div class="panel panel-default">
                    <div class="panel-body">
                        <div class="form-group">
                            <label for="book_name"> Book Name: </label>
                            <input type="text"  class="form-control" name="name">
                        </div>
                         <div class="form-group">
                            <label for="exampleFormControlSelect1">Author</label>
                            <select class="form-control"  name="<%= author._id %>">
                            <% author.forEach(function(authors){ %>
                            <option><%= authors._id %></option>
                            <% }); %>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="exampleFormControlSelect1">Genre</label>
                            <select class="form-control"  name="<%= genre._id %>">
                            <% genre.forEach(function(genres){ %>
                            <option><%= genres.name %></option>
                            <% }); %>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="numberInStock">Number in stock: </label>
                            <input type="number"  class="form-control" name="numberInStock">
                        </div>
                        <div class="form-group">
                            <label for="image">Image: </label>
                            <input type="text"  class="form-control" name="image">
                        </div>
                        <button type="submit" class="btn btn-success">Success</button>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

эточасть фронта, где я пытаюсь отправить данные в бэкент, но удается сохранить только имя, изображение, количество, но не ссылочные данные.

controller.js

   const create = (req, res, next) => {
  if (!req.body) {
    return res.status(400).json({
      error: 'No data',
    });
  }
  const book = new Books(req.body);
  book.save((err, result) => {
    if (err) {
      return res.status(400).json({
        error: err.message,
      });
    }


    return res.status(201).json({
      message: 'Book created succesfully',
      result,

    });
  });
};

Контроллер маршрутов

const express = require('express');

const router = express.Router();
const bookController = require('../controllers/book');
const booksave = require('../controllers/create');
const authorController = require('../controllers/author');
const genreController = require('../controllers/genre');

router.get('/books/home/:page', bookController.list);

router.get('/books/new', bookController.createTemplate);
router.post('/books/new/create', booksave.create);

router.get('/books/details/:id', bookController.bookDetail);

router.get('/books/new/create/genre', genreController.createGenreTemplate);
router.post('/books/new/genre', genreController.createGenre);

router.get('/books/new/create/author', authorController.createAuthorTemplate );
router.post('/books/new/author', authorController.createAuthor);




module.exports = router;

создать новый рендер

controller.createTemplate = (req, res) => {
  Author.find({}, (err, allAuthors) => {
    if (err) {
      console.log(err);
    } else {
      Genre.find({}, (err, allGenres) => {
        if (err) {
          console.log(err)
        } else {
          res.render('new', { author: allAuthors, genre: allGenres });
        }
      })

    }
  });
};

технически я надеюсь получитьчто когда я сохраняю информацию о книге, в ней есть ссылка на ее автора и жанр, и автоматически у автора появляются ссылки на книги, на которые ссылается тот же

Ответы [ 2 ]

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

из значений фронта я просто получаю

{name: 'Digital Fortress', numberInStock: '', image: ''}


const create = (req, res, next) => {
  if (!req.body) {
    return res.status(400).json({
      error: 'No data received',
    });
  }
  const book = new Books(req.body); 
  book.save((err, result) => {
    if (err) {
      return res.status(400).json({
        error: err.message,
      });
    }

    console.log(req.body);
    return res.status(201).json({
      message: 'Book created succesfully',
      result,

    });
  });
};
0 голосов
/ 11 апреля 2019

Измените атрибут имени в <select class="form-control" name="<%= genre._id %>"> на name='author' так же, как в bookSchema, а в <select class="form-control" name="<%= genre._id %>"> на name='genre'.
Проблема заключается в отправке запроса на отправку со следующим текстом:

{ name: /*value*/ , <%= author._id%>: /*value*/, <%= genre._id%>: /*value*/, numberInStock: /*value*/, image: /*image*/ }

Конструктор вашей Book модели распознает name, numberInStock and image, но не <%=author_id%> and <%=genre._id%>.
Измените также:

author: {
    type: mongoose.Schema.ObjectId,
    ref: 'Author'
  },
genre: {
    type: mongoose.Schema.ObjectId,
    ref: 'Genre'
}

на

author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: ref: 'Author'
}
genre: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Genre'
}

Вам также нужно передать genre._id вместо genres.name и author._id как value атрибутов, подобных этому:



<form action="/books/new/create" method="post">
    <select name="author">
    <% author.forEach(function(authors){ %>
      <option value="<%= authors._id %>" ><%= authors.name %></option>
    <% }); %>
    </select>
    <select name="genre">
    <% genre.forEach(function(genres){ %>
      <option value="<%= genres._id %>" ><%= genres.name %></option>
    <% }); %>
    </select>
    <button type="submit">Success</button>
</form>


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...