如何才能够让一个function中的http.request执行结束后返回结果
我想写一个类似于 cURL 的 function,并将结果通过 Express 的 Router 传递到网页上显示出来。
下面是 router/index.js
中的代码:
var express = require('express');
var router = express.Router();
var http = require("http");
/* cURL Module Test */
function cURL() {
var CURL_OPTION = {
hostname: 'fcsys.tk',
port: 80,
path: '/ip.php',
method: 'GET'
};
http.request(CURL_OPTION, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
global.abc = chunk;
});
}).end();
return global.abc;
}
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', {cURL: cURL});
});
module.exports = router;
下面是网页部分的代码,只是取得 cURL 的返回值而已:
<p>cURL: <%=cURL()%></p>
但是打开页面会无法得到返回值,是 undefined
。
这个该怎么样解决呢?
4 回复
我来抛砖引玉一下,首先http.request
是异步的,也就是说res.render
的时候cURL
并没有返回结果,所以是undefined
。
我的解决办法是使用一个res
队列,每次请求不返回内容,只是触发cURL
,然后在cURL
的回调里使用对应的res.render
。
或者把http.request
改成同步的,如eventproxy
、q
、promise
,具体实现留给楼下。
@HQidea 谢谢呢~已经按照第一种方法解决了,第二种使用 Q 库的方法初步测试了一下,没有成功,明天再试试呢。~
这个东西,使用队列不好,使用“请求池”的办法好些,哪个先到 ,哪个先res.send出去
@einsy 是的,队列这个词用的不对