我的$.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>


错误函数返回状态为200且响应正确的对象:Submitted! world

为什么不执行成功功能?

最佳答案

jsonCall的目的是一致地执行以下所有操作:


默认情况下,通过POST方法发送请求,该方法适用于类似RPC的API,在这种情况下,缓存只会导致意外的麻烦。这与getJSON不同。
将请求主体数据也以JSON格式发送,从而允许将所有JSON类型忠实地发送到服务器,这与传统形式数据的纯文本处理及其发送对象和数组的方式不同。尽管服务器仍然不应该信任它,但它效率更高。
是的,期望响应为JSON格式。


出现错误的原因是因为您没有将JSON发送到浏览器。请注意,我们在这里谈论的是浏览器端插件,它无法控制您在服务器端的工作,这取决于您。

至于为什么必须自己呼叫JSON.stringify

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

我们的典型做法是执行以下操作:

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


在浏览器端,首先确认result.messageresult.status之后再查看okresult当然是我们通过jsonCall收到的对象。

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

希望这会有所帮助!

09-25 19:02