我的$.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.message
是result.status
之后再查看ok
。 result
当然是我们通过jsonCall
收到的对象。问我们为什么不采用REST方法是很合理的。原因是REST并不总是总是一对一地映射到可能发生的错误,我们发现使用更灵活的状态字段更有意义。您的喜好可能会有所不同,当然没有人会阻止您编写自己的路线并通过
window.fetch
,$.post
或任何漂浮在您船上的东西与他们进行通信。 $.jsonCall
,self.api
和self.html
(扩展小部件播放器和模式的代码中的后两个)很方便。如果需要,请使用它们。希望这会有所帮助!