#javascript #node.js #reactjs #express #axios
#javascript #node.js #reactjs #выразить #axios
Вопрос:
Я использую Axios для обработки моих запросов в моем приложении. Я подтвердил через PostMan, что мой запрос на удаление работает, теперь я пишу код для интерфейса, и я получаю ошибку 404 в моем событии click.
Я выделил проблему для axios.по какой-то причине, когда запускается событие onClick, оно не передает информацию в req.body.
Я подтвердил, что «movie» в методе deleteMovie — это идентификатор, который я хочу получить из переданного реквизита.
App.jsx :
deleteMovie(movie) {
axios.delete('/movies', { data: { id: movie } }) // movie = ID of the movie entry in mySQL
.then(res => {this.setState({
movies: this.state.movies
})})
.catch(err => {console.log(err)})
}
server.js:
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const movies = require('./controllers/movies.js');
const db = require('./db/connection.js');
const app = express();
const publicDirectory = path.join(__dirname, '../client/dist');
app.use(bodyParser.json());
app.use(express.static(publicDirectory));
app.get('/movies', movies.get);
app.post('/movies', movies.post);
app.delete('/movies', movies.delete);
app.listen(3000);
файл контроллера:
module.exports = {
delete: (req, res) => {
console.log('req.body console log:', req.body); // This is currently returning: {} Info from front end never makes it here
const movie = req.body.id;
const query = `DELETE FROM movieList WHERE id = ${movie}`;
model.deleteMovie(query, (err) => {
if (err) {
res.status(404);
res.end();
} else {
res.sendStatus(201);
}
});
}
}
файл модели:
module.exports.deleteMovie = (query, callback) => {
db.connection.query(query, err => {
return err ? callback(err) : callback(null);
})
}
Комментарии:
1. Посмотрите на вкладку сеть отладчика Chrome и посмотрите, какой ИМЕННО запрос
axios.delete()
отправляется. Вы хотите определить, находится ли{id: movie}
в теле запроса на удаление или нет, и помечен ли запрос как application / json, и действительно ли данные в формате JSON. Если это так, то проблема решена на стороне Express. Если его там нет, значит, проблема в вызове axios. Сузьте проблему, чтобы вы знали, на чем сосредоточить дальнейшие усилия и отладку.2. Не может действительно помочь очень эффективно, если вы просто публикуете и исчезаете. Односторонние разговоры работают не очень хорошо. Stackoverflow не похож на какой-то онлайн-форум, где вы публикуете и возвращаетесь на следующий день, чтобы проверить ответы. Вы получите лучшую помощь, если будете часто проверять после публикации, чтобы вы могли взаимодействовать с теми, кто пытается помочь.
3. @jfriend00 Привет, извините, что я опубликовал, что подтвердил, что видел «application / json» на вкладке «Сеть» в Chrome. Я удалил его, когда что-то пришло в голову, и я хотел подтвердить перед повторной публикацией. В итоге я решил эту проблему, изменив свой запрос на УДАЛЕНИЕ на другой формат, например: deleteMovie (movie) { axios({метод: ‘delete’, url: ‘/ movies’, заголовок: ‘application / json’, данные: { id: movie } }) } Можете ли вы помочья понимаю, почему этот формат работает? Спасибо.
4. Что ж, способ выяснить, почему, заключался в том, чтобы тщательно отладить ваш исходный вызов axios и посмотреть, чего в нем не хватает и / или что отличается от запроса, который отправляет новый код. Вот как вы могли бы узнать.
Ответ №1:
Похоже, что это ошибка в самом axios, попробуйте перейти к 0.21 — смотрите Здесь Для исправления https://github.com/axios/axios/pull/3282
Ответ №2:
При чтении вашего кода может оказаться, что вы обертываете свой идентификатор фильма в объект. вот так: {data: {id: movie};
Это может вызвать некоторые проблемы при попытке использовать эти данные с вашего экспресс-сервера в объекте запроса. Вы пытаетесь использовать этот идентификатор следующим образом: const movie = req.body.id;
Но, похоже, вам следует поступить так: const movie = req.body.data.id;
поскольку вы переносите идентификатор в другой объект. Обычно это то, что вы делаете при отправке данных из API, однако не так часто из внешнего интерфейса. Попробуйте вместо этого просто установить параметр data как анонимный объект с идентификатором: movie . Может быть, это просто небольшая проблема, из которой вы делаете запрос на удаление.
deleteMovie(movie) {
axios.delete('/movies', { id: movie }) // movie = ID of the movie entry in mySQL
.then(res => {this.setState({
movies: this.state.movies
})})
.catch(err => {console.log(err)})
}