如何将帖子转发到其他域名?

时间:2016-02-02 09:55:57

标签: node.js

我有一个中间层,可以作为前端和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;从来没有被触发,让我怀疑这个帖子有问题。

2 个答案:

答案 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的可用性也可能取决于使用的承诺风格。