JS Fetch 仅将 object ID 发布到本地主机

JS Fetch posts only object ID to localhost

当我使用 fetch 发送表单数据时,只有 _id 被注册到我的数据库中。

使用 postman 到 post 确实将正确的数据发送到数据库。此外,将 posts 提取到 heroku 上的另一台服务器也很好(不幸的是,我不知道该服务器是如何设置的)。

对于 postman 我已经尝试将 Header 内容类型设置为 x-www-form-urlencoded,当这没有解决问题时,我将内容类型设置为 json.那也没有用。 body Content-Type 设置为 x-www-form-urlencoded.

使用 fetch 从 express 服务器(启用了 cors)获取数据工作正常。数据也被正确记录,所以我很确定它与 post 请求有关....

  sendToServer () {
    console.log(this.state)
    fetch(`http://localhost:3000`, {
      method: "post",
      headers: {
        // also tried with 'application/json'
        'Accept': 'application/x-www-form-urlencoded',
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: JSON.stringify(this.state)
    })
  }

也许这会更加清晰,我期待的 object 是

{
  "_id": "59adb44602416d102c095260",
  "title":"meetup",
  "date":"2017-09-06T00:00:00.000Z",
  "venue":"starbucks"
}

但我得到的是:

{
   "_id": "59adb44c02416d102c095261"
}

服务器代码:

//index.js

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

const app = express();
const db = require('./db');
const router = require('./router');


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

app.listen(3000, ()=>{
  console.log('express app listening on port 3000')
})

//router.js
const express = require('express');
const router = express.Router();

const controller = require('./controller')

router.get('/', controller.getAll)
router.post('/', controller.create)

module.exports = router;

//controller.js

const mongoose = require('mongoose');
const EventModel = require('./model');

const getAll = async (req, res) => {
  res.send(await EventModel.find());
}

const create = async (req, res) => {
  const newEvent = EventModel({
    title: req.body.title,
    date: req.body.date,
    venue: req.body.venue,
  });
  await newEvent.save();
  res.send(newEvent);
}

module.exports = {getAll, create};

//model.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const Event = new Schema({
  title: String,
  date: Date,
  venue: String,
}, {versionKey: false});

const EventModel = mongoose.model('Event', Event);

module.exports = EventModel;

//db.js
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/cw-events', {useMongoClient: true});
mongoose.Promise = global.Promise;

mongoose.connection.on('connected', () => {
  console.log('Mongoose connected')
})

我意识到我的问题是我格式化了正文解析器以解析来自 url 编码的邮递员的请求。我所要做的就是将其更改为 json,因此:

//from this
app.use(bodyParser.urlencoded({ extended: false }));

//to this
app.use(bodyParser.json());

所以现在它解析 json 格式,这就是 fetch 发布的格式。