Экспресс-отправка данных через тело запроса, но метод запроса — GET?

#mysql #node.js #express

#mysql #node.js #экспресс

Вопрос:

Привет, это мой первый пост, так что извините, если я делаю здесь что-то не так, но будьте терпеливы со мной;)

Я пытаюсь отправить некоторые данные в формате JSON в мою базу данных MySQL с помощью Express, но всякий раз, когда я использую что-то еще, кроме app.get (), это не удается. Я думаю, это потому, что метод запроса, отображаемый в браузере, всегда GET, но я не знаю почему. Что я делаю не так? Как метод запроса может быть GET, когда я использую app.post()?

 const express = require('express');
const mysql = require('mysql');
const bodyParser = require('body-parser');

const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'masterkey',
    database: 'articelStorage'
});

const app = express();
app.use(bodyParser.json());
app.use(express.json());

//connect to db
db.connect((err) => {
    if (err) {
        throw err;
    }
    console.log('Myql connected...');
});

app.listen('3000', () => {
    console.log('Server started and running on port 3000...');
});

app.get('/getOne/:code', (req, res) => {
    let sql = "SELECT * FROM articels WHERE acode ='"  req.params.code "'";
    db.query(sql, (err, result) => {
        if (err) throw err;
            res.send(result);
    });
});

app.delete('/deleteOne/:code', (req, res) => {
    let sql = "DELETE FROM articels WHERE acode ='"  req.params.code  "'";
    db.query(sql, (err, result) => {
        if (err) throw err;
            res.send(result);
    });
});
  

Вот результат, который я получаю:

 Cannot GET /deleteOne/DE12345678
  

И заголовки:

Общая информация:

 Request URL: http://localhost:3000/deleteOne/DE12345678
Request Method: GET
Status Code: 404 Not Found
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade
  

Заголовки ответов:

 Connection: keep-alive
Content-Length: 159
Content-Security-Policy: default-src 'self'
Content-Type: text/html; charset=utf-8
Date: Thu, 07 Mar 2019 13:12:36 GMT
X-Content-Type-Options: nosniff
X-Powered-By: Express
  

Заголовки запроса:

 Accept: text/html,application/xhtml xml,application/xml;
        q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Host: localhost:3000
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
            (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
  

Заранее спасибо.

Комментарии:

1. Можете ли вы опубликовать код, который вы используете (интерфейсную часть) для вызова вашего api? Вы пытаетесь вызвать свою конечную точку непосредственно из браузера? Если это так, метод всегда будет GET . Вы можете протестировать свой API с помощью таких инструментов, как Postman : getpostman.com

2. Спасибо, я этого не знал. Теперь все ясно.

Ответ №1:

Я думаю, что здесь есть неправильное представление.

Когда вы объявляете, app.get('/getOne/:code', (req, res)=>{..}) это означает, что маршрут доступен через HTTP GET . Аналогично для app.delete маршрут доступен методом запроса HTTP DELETE .

Теперь, когда вы открываете URL в браузере, это ВСЕГДА HTTP GET запрос. Вот почему /getOne будет работать, но не delete тот.

Вам нужно использовать приложение, подобное Postman (или curl), для тестирования вашего REST api.

Если вы обращаетесь к конечной точке с клиента, используйте axios или request или xmlhttprequest и задайте метод запроса таким, каким вы хотите, чтобы он был.

Например,

 axios({url:url, method:'delete', { data: { foo: "bar" } });// or axios.delete(..)