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 发布的格式。
当我使用 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 发布的格式。