2016-03-29 21 views
1

我有点新的NodeJS,和目前我用快递和请求(https://github.com/request/request)转发我的应用程序请求REST API服务器,如下图所示目前我的代码:如何更改请求的NodeJS响应流

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api')).pipe(res); 
}); 

此代码在REST API服务器正常工作时起作用,但如果其余api服务器发生故障,我的nodejs应用程序也会关闭,因为请求流将失败并且错误不会被我的应用程序捕获。 我查请求GitHub的页面,它提供了处理流错误的一种方式,像

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
    })).pipe(res); 
}); 

这只能记录错误和防止我的NodeJS应用程序崩溃,但我想改变的响应时发生错误,以便为改变反应可通过管道输送到最后一个,例如,我想在伪做什么:

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
     // what I want to do in pseudocode 
     response.statusCode = 500; 
     response.json = { 
      reason: err.errno 
     }; 
    })).pipe(res); 
}); 

有没有解决我的问题的任何方式?感谢您的任何想法!

+1

这也许是不可能的,只有一个请求,因为头部已经被错误是可能发生的时间发送。相反,你应该做的是从节点服务器向api服务器发出一个HEAD请求,以检查它是否在线,然后如果出现这种情况,请将API请求传送给客户端。否则,你可以发送你想要的任何响应给客户端。 –

回答

0

未经测试,但您是否可以将错误传递回中间件来处理响应?

app.use('/rest/*', function(req, res, next) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     return next(err) 
    })).pipe(res); 
}); 

处理好,像这样

// Exception handling 
app.use(function (error, req, res, next) { 
    console.log(error); 
    res.status(500).send(JSON.stringify(error));  
    next(); 
}); 
+0

非常感谢,它的作品!我唯一的问题是在异常处理方法中使用next()方法,我试图删除next()方法调用,它也可以。你能告诉我为什么next()在这里使用? – Bill

+0

如果您需要执行更多(中间件)操作,则只能在异常处理中真正使用 - 例如,您可能具有日志记录功能 – ossie

+0

非常感谢! – Bill