Ember компонент POST to Express API выдает ошибку - PullRequest
0 голосов
/ 08 февраля 2019

При попытке сделать сообщение из компонента в моем приложении ember в мой экспресс-API я получаю

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 оба возвращают правильные значения, но блогпост дает мне

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 / routs / 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>

Я подтвердил, что API-интерфейс для почты работает с почтальоном, поэтому я не уверен, чтопроблема с 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 возвращает {}, поэтому он ошибается

1 Ответ

0 голосов
/ 12 февраля 2019

разобрался с моей проблемой.Для тех, у кого есть похожие проблемы при попытке использовать экспресс-API с ember в качестве внешнего интерфейса, я понял, что отправка запросов от emberjs отправляет заголовок с типом содержимого "application/vnd.api+json".

Итак, в моем экспрессе server.js я добавил app.use(bodyParser.json({ type: 'application/vnd.api+json' }));, который позволяет анализатору тела анализировать и возвращать правильный req.body.Затем я создал новый сериализатор ember generate serializer blogpost для моего приложения ember, который сериализовал запрос в формат, ожидаемый моим 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;
  }
});
...