Ember 组件 POST 到 Express API 给出错误
Ember component POST to Express API gives error
当尝试从我的 ember 应用程序中的组件向我的快递 api 执行 post 时,我收到了
SyntaxError: Unexpected token V in JSON at position 0
在 chrome 的网络检查器中检查我收到的响应时,我看到了
ValidationError: body: Path `body` is required., title: Path `title` is required. undefined
blogpost.title 和 .body return 都是正确的值,但是博客 post 给了我
adapterError: SyntaxError: Unexpected token V in JSON at position 0 at parse
EmberApp/App/Components/create-new-post/Component.js
export default Component.extend({
blogpost: null,
router: inject('-routing'),
actions: {
save: function (blogpost) {
console.log(blogpost.title);
console.log(blogpost.title);
console.log(blogpost);
blogpost.save()
.then(
(value) => {
Ember.Logger.info(value);
this.get('router').transitionTo('index')
}
)
.catch(
(err) => {
Ember.Logger.info('failure to save');
console.log(err);
}
)
}
}
});
EmberApp/App/Components/create-new-post/template.hbs
<form {{action "save" blogpost on="submit"}}>
<p>
{{input name="title" value=blogpost.title class="form-control" placeholder="Title"}}
</p>
<p>
{{textarea name="body" value=blogpost.body class="form-control" placeholder="Body" rows="10" cols="140"}}
</p>
<p>
<button class="btn btn-primary btn-block" type="submit" value="Save">Publish</button>
</p>
</form>
EmberApp/App/routes/createpost.js
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return this.store.createRecord('blogpost');
}
});
EmberApp/App/templates/createpost.hbs
<div class="container">
<div class="col-sm-12 pull-left">
{{create-new-post blogpost=model }}
</div>
</div>
我已经确认 post 的 api 路由与 postman 一起工作,所以我不确定 ember 的问题是什么。
ExpressAPI 路由器
router.post('/blogposts', (req, res) => {
console.log('In router');
console.log(req.body);
let newBlogPost = new BlogPostSchema(req.body);
newBlogPost.save((err, blogpost) => {
if(err){
console.log(err +" "+blogpost);
res.send(err +" "+blogpost);
}
console.log(blogpost);
res.json(blogpost);
});
});
req.body returns {} 这就是它命中 err
的原因
解决了我的问题。对于在尝试使用带有 ember 的 express api 作为前端时遇到类似问题的任何人,我意识到来自 emberjs 的 post 请求发送了一个 header "application/vnd.api+json"
内容类型。
所以在我的表达中 server.js
我添加了
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
让 body 解析器解析 return 正确的 req.body。然后,我为我的 ember 应用程序创建了一个新的序列化程序 ember generate serializer blogpost
,它将请求序列化为我的 express api 所期望的格式。
EmberApp/Serializers/blogpost.js
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
serialize(snapshot, options){
let json = this._super(...arguments);
let newjson = {
title: json.data.attributes.title,
body: json.data.attributes.body
};
return newjson;
}
});
当尝试从我的 ember 应用程序中的组件向我的快递 api 执行 post 时,我收到了
SyntaxError: Unexpected token V in JSON at position 0
在 chrome 的网络检查器中检查我收到的响应时,我看到了
ValidationError: body: Path `body` is required., title: Path `title` is required. undefined
blogpost.title 和 .body return 都是正确的值,但是博客 post 给了我
adapterError: SyntaxError: Unexpected token V in JSON at position 0 at parse
EmberApp/App/Components/create-new-post/Component.js
export default Component.extend({
blogpost: null,
router: inject('-routing'),
actions: {
save: function (blogpost) {
console.log(blogpost.title);
console.log(blogpost.title);
console.log(blogpost);
blogpost.save()
.then(
(value) => {
Ember.Logger.info(value);
this.get('router').transitionTo('index')
}
)
.catch(
(err) => {
Ember.Logger.info('failure to save');
console.log(err);
}
)
}
}
});
EmberApp/App/Components/create-new-post/template.hbs
<form {{action "save" blogpost on="submit"}}>
<p>
{{input name="title" value=blogpost.title class="form-control" placeholder="Title"}}
</p>
<p>
{{textarea name="body" value=blogpost.body class="form-control" placeholder="Body" rows="10" cols="140"}}
</p>
<p>
<button class="btn btn-primary btn-block" type="submit" value="Save">Publish</button>
</p>
</form>
EmberApp/App/routes/createpost.js
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return this.store.createRecord('blogpost');
}
});
EmberApp/App/templates/createpost.hbs
<div class="container">
<div class="col-sm-12 pull-left">
{{create-new-post blogpost=model }}
</div>
</div>
我已经确认 post 的 api 路由与 postman 一起工作,所以我不确定 ember 的问题是什么。
ExpressAPI 路由器
router.post('/blogposts', (req, res) => {
console.log('In router');
console.log(req.body);
let newBlogPost = new BlogPostSchema(req.body);
newBlogPost.save((err, blogpost) => {
if(err){
console.log(err +" "+blogpost);
res.send(err +" "+blogpost);
}
console.log(blogpost);
res.json(blogpost);
});
});
req.body returns {} 这就是它命中 err
的原因解决了我的问题。对于在尝试使用带有 ember 的 express api 作为前端时遇到类似问题的任何人,我意识到来自 emberjs 的 post 请求发送了一个 header "application/vnd.api+json"
内容类型。
所以在我的表达中 server.js
我添加了
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
让 body 解析器解析 return 正确的 req.body。然后,我为我的 ember 应用程序创建了一个新的序列化程序 ember generate serializer blogpost
,它将请求序列化为我的 express api 所期望的格式。
EmberApp/Serializers/blogpost.js
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
serialize(snapshot, options){
let json = this._super(...arguments);
let newjson = {
title: json.data.attributes.title,
body: json.data.attributes.body
};
return newjson;
}
});