【发布时间】:2015-01-20 19:32:28
【问题描述】:
最近我开始学习一点关于 Node.js 及其功能的知识,并尝试将它用于一些 Web 服务。 我想创建一个 Web 服务,作为 Web 请求的代理。 我希望我的服务以这种方式工作:
- 用户将访问我的服务 -> http://myproxyservice.com/api/getuserinfo/tom
- 我的服务将执行请求 -> http://targetsite.com/user?name=tom
- 响应的数据会反映给用户。
为了实现它,我使用了以下代码:
app.js:
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
var proxy = require('./proxy_query.js')
function makeProxyApiRequest(name) {
return proxy.getUserData(name, parseProxyApiRequest);
}
function parseProxyApiRequest(data) {
returned_data = JSON.parse(data);
if (returned_data.error) {
console.log('An eror has occoured. details: ' + JSON.stringify(returned_data));
returned_data = '';
}
return JSON.stringify(returned_data);
}
app.post('/api/getuserinfo/tom', function(request, response) {
makeProxyApiRequest('tom', response);
//response.end(result);
});
var port = 7331;
proxy_query.js:
var https = require('https');
var callback = undefined;
var options = {
host: 'targetsite.com',
port: 443,
method: 'GET',
};
function resultHandlerCallback(result) {
var buffer = '';
result.setEncoding('utf8');
result.on('data', function(chunk){
buffer += chunk;
});
result.on('end', function(){
if (callback) {
callback(buffer);
}
});
}
exports.getUserData = function(name, user_callback) {
callback = user_callback
options['path'] = user + '?name=' + name;
var request = https.get(options, resultHandlerCallback);
request.on('error', function(e){
console.log('error from proxy_query:getUserData: ' + e.message)
});
request.end();
}
app.listen(port);
我希望我没有搞砸这段代码,因为我替换了一些东西以适合我的示例。
无论如何,问题是我想在 HTTP 请求完成后将响应发布给用户,但我找不到这样做的方法,因为我使用 express,express 使用异步调用,http 请求也是如此。 我知道如果我想这样做,我应该将 makeProxyApiRequest 传递给响应对象,这样他就可以将它传递给回调,但由于异步问题,这是不可能的。
有什么建议吗? 我们将不胜感激。
【问题讨论】:
-
我注意到你的
makeProxyApiRequest和parseProxyApiRequest函数都被阻塞了。对于这两种情况,我强烈建议遵循 Node 的function name(input, callbackfunction)模式,当一切正常时,回调在您的函数中调用为callback(false, result),或者当出现问题时调用为callback(someerrorobjectorstring)。 -
谢谢,这是个好主意。但这并不能解决问题。你有什么建议吗?
-
给你写一个答案,但要记住的一点是,用户的请求在他们的浏览器和他们正在联系的服务器之间是总是异步的,所以这实际上并不是一个问题。 express 迫使您异步形成响应的事实实际上是一个好处,因此您不会想要同步地做所有事情。
标签: javascript node.js asynchronous proxy callback