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方法,但我不知道如何,因为:
- Express(app)对象在这里不可用(在app.js中声明,但不在path文件中)
- 我不知道如何发送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请求的事实上的模块。
- 在Node.JS和Express中的HTTPS服务器上拦截HTTP响应
- Express:访问路由中的app.set()设置
- ExpressJS:是否可以在不同路由function之间共享相同路由的variables?
- Express + Node:与原始文件相比,通过response.download()下载的文件大小不同
- Express.js:如何绕过某些路线的Everyauth?
- 如何写入Node.js Connect / Expresslogging器?
- ExpressJS中的ES6类有不同的performance?
- 安装Express时出错
- 在request.pipe之前防止快速的body-parser移除主体