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