我有一个中间层,可以作为前端和api服务之间的协作。对于所有帖子,我只想将它们转发到api-service。
例如,当我发布此表单时:
<form method="post" action="../rest/1/comment/create" class="questionResponseForm expandable">
<textarea name="content" class="questionResponseTextarea"></textarea>
<input type="hidden" name="code" value="1-1454406440-58e7fa2e7897ffb90c9391febdd9c49c2bd2f3d6">
<input type="hidden" name="q_id" value="1425">
<input type="hidden" name="p_id" value="1425">
<button type="submit" class="questionResponseButton trigger"><svg class="questionTitleIcon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-pencil"></use></svg>Kommentera frågan</button>
</form>
我想将完全相同的表单发布到另一台服务器。
我使用requstify:
在我的案例中,app.apiUrl是localhost(节点服务器在localhost:3000上运行)req.originalUrl确保使用相同的url。 req.body包含后置参数。app.post('/rest/1/:object/:method', post);
function post(req,res){
var fullUrl = app.apiUrl + req.originalUrl,
requestify = require('requestify');
requestify.post(fullUrl, req.body).then(function(response) {
console.log(response);
app.res.render('master',response);
})
}
req.body:
{ content: 'öljkökljölkjölkj',
code: '1-1454409967-dd95a558b2753d8f2f6239c1a2614b32d51474d0',
q_id: '1422',
p_id: '1422' }
&#34;然后&#34;从来没有被触发,让我怀疑这个帖子有问题。
答案 0 :(得分:0)
添加catch块并调试post调用中发生的事情。修改后请求后调用
requestify.post(fullUrl, req.body).then(function(response) { console.log(response); app.res.render('master',response); }).catch(function(err){ console.log('error:', err); });
答案 1 :(得分:0)
由于您提到您的承诺似乎永远不会得到解决(then
注册的回调永远不会被调用),我怀疑是出现了错误,导致承诺被拒绝。从您的代码中可以看出,您没有注册任何拒绝处理程序,也没有终止承诺链。
从当前信息中我无法确定可能引发了什么错误以及原因,但为了进一步调试,您应该添加拒绝处理程序:
requestify.post(fullUrl, req.body).then(function(response) {
console.log(response);
app.res.render('master',response);
}).fail(function(err) {
// add code here to handle error and/or debug reason for error
}).done();
请注意,根据使用的承诺的风格,fail
可以被称为catch
,或者您可以将拒绝处理程序作为then
的第二个参数提供:
requestify.post(fullUrl, req.body).then(function(response) {
console.log(response);
app.res.render('master',response);
}, function(err) {
// add code here to handle error and/or debug reason for error
});
另请注意,使用done
终止承诺链是一种好习惯,否则未处理的错误可能会被完全忽略,这可能会导致您花费大量时间没有意识到出现问题:
somePromise.then(callback1).then(callback2).then(callback3).fail(errorhandler).done();
如果在终止promise链时仍然未处理错误,则将在事件循环的未来转向时抛出错误,因此它至少是可见的。请注意,done
的可用性也可能取决于使用的承诺风格。