Макет библиотеки
Отображает книги (жанр названия автора) из базы данных и возможность добавить книгу.
Данные правильно получены из моего компонента реакции.
Данные передаются в натуральной форме моему создателю действия, а также корректно обрабатываются редуктором.
Казалось бы, мой асинхронный поток правильно настроен для отправки запроса с помощью axios. Я правильно загружаю книги, уже находящиеся в базе данных, с запросом get.
Мои маршруты работают, поскольку я могу правильно добавить книгу и получить все книги с помощью почтальона. И опять же, мои книги отображаются правильно при получении из моего компонента реакции.
Где проблема? Почему мой почтовый запрос не достигает моей базы данных?
Мои действия -
export const fetchBooks = () => dispatch => {
axios.get('/books')
.then(res => dispatch({
type: FETCH_BOOKS,
payload: res.data
}))
}
export const addBook = ({ title, author, genre}) => dispatch => {
dispatch(addBookStarted())
axios
.post('/books', {
title,
author,
genre
})
.then(res => {
dispatch(addBookSuccess(res.data))
})
.catch(err => {
dispatch(addBookFailure(err.message))
})
}
const addBookSuccess = book => ({
type: ADD_BOOK_SUCCESS,
payload: {
...book
}
});
const addBookStarted = () => ({
type: ADD_BOOK_STARTED
});
Мой редуктор -
const initialState = {
books: [],
error: null,
loadinng: false
}
export default function(state = initialState, action) {
switch(action.type) {
case FETCH_BOOKS:
return {
...state,
books: action.payload
}
case ADD_BOOK_STARTED:
return {
...state,
loading: true
}
case ADD_BOOK_SUCCESS:
return {
...state,
loading: false,
error: null,
books: [...state.books, action.payload]
}
case ADD_BOOK_FAILURE:
return {
...state,
loading: false,
error: action.payload.error
}
default:
return state
}
}
Error -
{ ValidationError: book validation failed: title: Path `title` is required., aut
hor: Path `author` is required., genre: Path `genre` is required.
at ValidationError.inspect (C:\Users\Leeko\documents\repos\libapp\backend\no
de_modules\mongoose\lib\error\validation.js:59:24)
at formatValue (internal/util/inspect.js:526:31)
at inspect (internal/util/inspect.js:194:10)
at Object.formatWithOptions (util.js:90:12)
at Console.(anonymous function) (console.js:204:15)
at Console.warn (console.js:221:31)
at b.save.then.catch.err (C:\Users\Leeko\documents\repos\libapp\backend\serv
er.js:34:31)
at process.internalTickCallback (internal/process/next_tick.js:77:7)
errors:
{ title:
{ ValidatorError: Path `title` is required.
at new ValidatorError (C:\Users\Leeko\documents\repos\libapp\backend\n
ode_modules\mongoose\lib\error\validator.js:29:11)
at validate (C:\Users\Leeko\documents\repos\libapp\backend\node_module
s\mongoose\lib\schematype.js:926:13)
at C:\Users\Leeko\documents\repos\libapp\backend\node_modules\mongoose
\lib\schematype.js:979:11
at Array.forEach (<anonymous>)
at SchemaString.SchemaType.doValidate (C:\Users\Leeko\documents\repos\
libapp\backend\node_modules\mongoose\lib\schematype.js:935:19)
at C:\Users\Leeko\documents\repos\libapp\backend\node_modules\mongoose
\lib\document.js:1941:9
at process.internalTickCallback (internal/process/next_tick.js:70:11)
message: 'Path `title` is required.',
name: 'ValidatorError',
properties: [Object],
kind: 'required',
path: 'title',
value: undefined,
reason: undefined,
[Symbol(mongoose:validatorError)]: true },
sever.js (маршрут)
const mongoose = require("mongoose");
const express = require("express");
const bodyParser = require("body-parser");
const db = require('./config/db');
const Book = require('./models/book');
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.route('/books')
.get((req, res) => {
Book.find({}).then(docs => res.json(docs))
})
.post((req, res) => {
let b = new Book({
title: req.body.title,
author: req.body.author,
genre: req.body.genre
})
b.save()
.then(doc => console.log(doc))
.catch(err => console.error(err))
res.json(req.body)
})
книжная модель
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const BookSchema = new Schema({
title: {
type: String,
// required: true,
lowercase: true
},
author: {
type: String,
// required: true,
lowercase: true
},
genre: {
type: String,
// required: true,
lowercase: true
},
pages: {
type: Number
},
available: {
type: Boolean,
default: true
}
});
module.exports = Book = mongoose.model('book', BookSchema);