最近我開始學習一些關於Node.js及其功能的知識,並嘗試將它用於某些Web服務。 我想創建一個Web服務,它將作爲Web請求的代理。 我希望我的服務,工作方式:Node.js以異步數據響應
- 用戶要訪問我的服務 - >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響應對象,以便能夠將它傳遞給回調函數,但由於asyn問題而不可行。
有什麼建議嗎? 幫助將不勝感激。
我注意到'makeProxyApiRequest'和'parseProxyApiRequest'函數都被阻塞。對於這兩種情況,我強烈推薦以下Node的'function name(input,callbackfunction)'模式,當一切正常時,或者回調函數稱爲'callback(false,result)' (someerrorobjectorstring)'當出現問題時。 – 2014-11-22 20:37:32
謝謝,這是一個好主意。但它不能解決問題。你有什麼建議嗎? – CodeNinja 2014-11-22 20:41:18
給你寫了一個答案,但要記住的一件事是,用戶的請求在他們的瀏覽器和他們聯繫的服務器之間總是*異步,所以這實際上不是問題。表達強迫你異步形成你的反應的事實在這裏實際上是一種好處,所以你不會試圖同步做所有事情。 – 2014-11-22 20:46:20