$ .jsonCall结果错误,但接收正确的数据

时间:2018-06-21 04:24:14

标签: javascript node.js apostrophe-cms

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

为什么不执行成功功能?

2 个答案:

答案 0 :(得分:2)

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.messageresult.status之后再查看okresult当然是我们通过jsonCall收到的对象。

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

希望这会有所帮助!

答案 1 :(得分:1)

$.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));
  });
}