Реагировать на запросы POST с помощью Express / Node и MongoDB - PullRequest
0 голосов
/ 31 мая 2018

Я пишу программу, которая использует React в качестве внешнего интерфейса и API Express / Node для внутреннего интерфейса, который затем выполняет операции CRUD в базе данных MongoDB.Прямо сейчас я использую встроенный API JS fetch () для выполнения операций GET / POST на моем внешнем интерфейсе.GET-запросы работают нормально, но мои POST-запросы, похоже, не работают.На моем внешнем интерфейсе у меня есть форма и обработчик для отправки формы следующим образом:

handleSubmit(){
    let databody = {
        "name": this.state.nameIn,
        "quote": this.state.quoteIn
    }

    return fetch('http://localhost:5002/stored', {
        method: 'POST',
        body: JSON.stringify(databody),
        headers: {
            'Content-Type': 'application/json'
        },
    })
    .then(res => res.json())
    .then(data => console.log(data)); 
}


render(){
    return (
        <div>
            <form onSubmit={this.handleSubmit}>
                <label>
                    Name
                    <input type="text" name="name" value={this.nameIn} onChange={this.handleNameChange}/>
                </label>
                <label>
                    quote
                    <input type="text" name="quote" value={this.quoteIn} onChange={this.handleQuoteChange}/>
                </label>
                <input type="submit" value="Add to DB" />
            </form> 
        </div>
    );
}

Затем в моем Express API, который находится на порту 5002, у меня есть:

app.post('/stored', (req, res) => {
    console.log(req.body);
    db.collection('quotes').insertOne(req.body, (err, data) => {
        if(err) return console.log(err);
        res.send(('saved to db: ' + data));
    })
});

Однако при отправке формы запрос отображается в Express API с пустым телом.Console.log показывает, что req.body - это просто {} Мне интересно, что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Если вы используете Express 4.16 или новее, вы можете просто использовать express.json () , он попытается проанализировать JSON тела запроса и сохранить его в req.body, но только если заголовок«Content-Type: application / json» отправляется вместе с запросом:

const app = express();
app.use(express.json()); // Parses request body if type is json. Saves to req.body.
0 голосов
/ 31 мая 2018

используйте body-parser

в вашем экспресс-коде и добавьте:

global.bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
  extended: true,
  limit: '50mb',
  parameterLimit: 100000
}))
app.use(bodyParser.json({
  limit: '50mb',
  parameterLimit: 100000
}))


app.post('/stored', (req, res) => {
    console.log(req.body);
    db.collection('quotes').insertOne(req.body, (err, data) => {
        if(err) return console.log(err);
        res.send(('saved to db: ' + data));
    })
});

в своем мобильном:

handleSubmit:function(e){
   e.preventDefault();
    let databody = {
        "name": this.state.nameIn,
        "quote": this.state.quoteIn
    }

    fetch('http://localhost:5002/stored', {
            method: 'POST',
            body: JSON.stringify(databody),
            headers: {
                'Content-Type': 'application/json'
            },
        })
        .then(res => res.json())
        .then(data => console.log(data));
}
...