我的$.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
为什么不执行成功功能?
答案 0 :(得分:2)
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.message
是result.status
之后再查看ok
。 result
当然是我们通过jsonCall
收到的对象。
有理由问为什么我们在这里不采用REST方法。原因是REST并不总是总是一对一地映射到可能发生的错误,我们发现使用更灵活的状态字段更有意义。您的偏好可能会有所不同,当然没有人会阻止您编写自己的路线,并通过window.fetch
,$.post
或任何漂浮在您船上的东西与他们进行交流。 $.jsonCall
,self.api
和self.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));
});
}