Как отключить API выборки для отправки запроса OPTIONS с заголовком Content-Type? - PullRequest
0 голосов
/ 03 октября 2018

У меня проблема с моим API.Когда я использую выборку из ReactJS для отправки un json на сервер NodeJS, сервер падает ...

вызов выборки:

 const jso = JSON.stringify({
        username: this.state.username,
        password: this.state.password
      })
      fetch("URL/authentication", {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jso,
      }).then(res => res.json()).then((result) => {
        this.setState({
          answer: result.answer
        })

      }, (error) => {
        this.setState({isLoaded: true, error});

      })
  }

Вот внутренняя сторона

var express = require('express');
var app = express();
var cors = require('cors');
var bodyParser = require('body-parser')
var mysql = require("mysql");

//Enabeling all Access-Control-Allow-Origin
app.use(cors());
app.options('*', cors())

var port = process.env.PORT || 5000

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//omitted mysql connections details

app.post('/authentication', (req, res) **=> {
    email = req.body.username,
    password = req.body.password,
    matching = "false"
    var dbpassword

    sql = "SELECT password FROM users WHERE email = ?";
    db.query(sql, email, (err, result, fields) => {
        if(err) {
            console.error('error query: ' + err.stack)
            return;
        }
        dbpassword = result[0].password;

         if(dbpassword === password){
        matching = "true";
        console.log(dbpassword + " : " + password);
        } 
        res.send({answer: matching});

    });
})

app.listen(port, function(){
    console.log("app running");
})

Дело в том, что это приводит к сбою моего сервера (размещенного на Heroku) каждый раз, когда я делаю запрос от внешнего интерфейса ...

Однако, когда я пытаюсь удалить часть заголовка с передней панелиВ конце концов, сервер не падает, но ничего не возвращает ...

После просмотра журналов я обнаружил, что, когда fetch имеет часть заголовка с 'Content-Type': 'application/json', он отправляет запрос OPTIONS до того, какпочтовый запрос ...

Мой вопрос: как я могу заставить это работать?Я попробовал почтовый запрос от почтальона, и он работает, поэтому я знаю, что мой сервер / алгоритм не проблема.Кроме того, сервер для серверной части - Heroku

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Я забыл обработать, когда мой интерфейс не отправляет запрос ...

Возможно, это не идеально, но работает:

app.post('/authentication', (req, res) => {
    email = req.body.username,
    password = req.body.password,
    matching = "false"
    var dbpassword

    if(email!=""){

        sql = "SELECT password FROM users WHERE email = ?";
        db.query(sql, email, (err, result, fields) => {
            if(err) {
                console.error('error query: ' + err.stack)
                return;
            }
            if(result.length > 0){
                dbpassword = result[0].password;

                if(dbpassword === password){
                matching = "true";
                console.log(dbpassword + " : " + password);
                } 
            }

            res.send(JSON.stringify({answer: matching}));
        });
    }

    else res.send(JSON.stringify({answer: matching}));
})
0 голосов
/ 03 октября 2018

Поскольку вы включаете CORS на экспресс-сервере, вам нужно изменить вызов извлечения.
Добавить параметр mode: cors

fetch("URL/authentication", {
    method: 'POST',
    mode: 'cors', // defaults to same-origin
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: this.state.username,
      password: this.state.password
    })
  })

Для получения дополнительной информации обратитесь к документации Fetch API.
Обратите внимание, что если вы выполняете это на локальном хосте, оно будет работать нормально, но, поскольку оно размещается в другом месте, это вызывает ошибку.

...