$.jsonCall 导致错误,但收到正确的数据

$.jsonCall results in error, but receives correct data

我的$.jsonCall同时失败和成功。

index.js

afterConstruct: function(self) {
  self.pushAsset('script', 'form', { when: 'always' });

  self.route('post', 'submit', function(req, res) {
    res.send('Submitted! ' + req.body.hello);
  });
}

form.js

(function( $ ) {
  $('.crstn-privacy form').submit(function(event) {
    event.preventDefault();

    $.jsonCall('/modules/privacy-widgets/submit', {
      hello: 'world'
    }, function(data) {
      console.log('Success:');
      console.log(data);
    }, function(err) {
      console.log('Error.');
      console.log(err);
    });
  });
})( jQuery );

widget.html

<div class="crstn-privacy">
  Privacy
  <form data-contact-form>
    <button type="submit">Submit</button>
  </form>
</div>

错误函数 returns 状态为 200 的对象和正确的响应:Submitted! world

为什么success函数没有执行?

$.jsonCall() 要求响应为 JSON。错误是因为它无法解析响应。发送响应时使用JSON.stringify()

afterConstruct: function(self) {
  self.pushAsset('script', 'form', { when: 'always' });

  self.route('post', 'submit', function(req, res) {
    res.send(JSON.stringify('Submitted! ' + req.body.hello));
  });
}

jsonCall 的目的是始终如一地执行以下所有操作:

  1. 默认通过POST方式发送请求,适合类RPC的API,缓存只会带来意想不到的痛苦。这不同于 getJSON.

  2. 也将 请求主体数据作为 JSON 发送,允许所有 JSON 类型忠实地发送到服务器,不像传统表单数据的纯文本处理及其发送对象和数组的技巧。它更有效率,虽然服务器当然仍然不应该信任它。

  3. 是的,希望响应采用 JSON 格式。

您出错的原因是您没有向浏览器发送 JSON。请注意,我们在这里谈论的是浏览器端插件,它无法控制您在服务器端所做的事情,那部分取决于您。

至于为什么要自己打电话给JSON.stringify

Express(Apostrophe 位于其上)足够智能,可以在将对象和数组传递给 res.send 时自动将它们编码为 JSON。但是,如果您 res.send 一个字符串,默认行为是发送该文字,实际字符串,这在使用 HTML 片段或类似内容回复的其他类型的路由中很有用。

我们的典型做法是做这样的事情:

res.send({ status: 'ok', message: 'my message here' })

而在浏览器端,首先验证result.statusok后再看result.messageresult 当然是我们通过 jsonCall.

收到的对象

问为什么我们不在这里采用 REST 方法是合理的。原因是 REST 并不总是将一对一映射到可能发生的错误,我们发现使用更灵活的状态字段更有意义。您的偏好可能会有所不同,当然没有人会阻止您按照自己的方式编写路线并通过 window.fetch$.post 或任何您喜欢的方式与他们交流。 $.jsonCallself.apiself.html(后两个在扩展小部件播放器和模式的代码中)是方便的。如果需要,请使用它们。

希望对您有所帮助!