ExpressJS – 联系外部API

这是事情:我有一个客户端发送数据到服务器。 该服务器必须联系外部API并将其响应发送回客户端。 一旦服务器获得客户端数据,我无法弄清楚如何以及在哪里可以联系外部API。

我路由客户端数据是这样的:

app.post('/getAutoComplete', routes.read); 

routes.read在req.body中检索数据。 用我的nodejs版本(没有expression框架),然后我这样请求api:

 var http = require('http'), options = { host : "192.168.1.38", port : 8080, path : "/myURL", method : 'POST' }; var webservice_data = ""; var webservice_request = http.request(options, function(webservice_response) { webservice_response.on('error', function(e){ console.log(e.message); }); webservice_response.on('data', function(chunk){ webservice_data += chunk;}); webservice_response.on('end', function(){res.send(webservice_data);}); }); webservice_request.write(req.body); webservice_request.end(); 

问题是,我想使用像app.post原生expressJS方法,但我不知道如何,因为:

  1. Express(app)对象在这里不可用(在app.js中声明,但不在path文件中)
  2. 我不知道如何发送POST数据与app.post

任何build议?

routes.read是一个函数。 你可以用额外的参数调用它,例如

 app.post('/getAutoComplete', function(req,res) { var q = req.query.q; // or whatever data you need routes.read(q, function(err, response) { if (err) throw err; return res.json(response); }); }); 

现在让routes.read函数使用第一个参数作为查询,当它从远程API收集到响应时,将第二个参数作为第一个参数,任何错误都作为第二个参数。

更新这个答案已经被挑选为答案,但是如果我也展示了一个routes.read的例子,它会更有帮助:

 routes.read = function(q, cb) { // pretend we calculate the result var result = q * 10; if (result > 100) { // call the callback with error set return cb("q value too high"); } // all is well, use setTimeout to demonstrate // an asynchronous return setTimeout(function() { cb(null, result) }, 2000); }; 
 app.post('/getAutoComplete', routes.read); // assuming routes.read lookes something like this routes.read = function read(req, res) { var http = require('http'), options = { host : "192.168.1.38", port : 8080, path : "/myURL", method : 'POST' }; var webservice_data = ""; var webservice_request = http.request(options, function(webservice_response) { webservice_response.on('error', function(e){ console.log(e.message); }); webservice_response.on('data', function(chunk){ webservice_data += chunk;}); webservice_response.on('end', function(){res.send(webservice_data);}); }); webservice_request.write(req.body); webservice_request.end(); }; 

另外检查出https://github.com/mikeal/request它是在节点中做web请求的事实上的模块。