如何才能够让一个function中的http.request执行结束后返回结果
发布于 8 年前 作者 dfc643 4039 次浏览 最后一次编辑是 6 年前 来自 问答

我想写一个类似于 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改成同步的,如eventproxyqpromise,具体实现留给楼下。

@HQidea 谢谢呢~已经按照第一种方法解决了,第二种使用 Q 库的方法初步测试了一下,没有成功,明天再试试呢。~

这个东西,使用队列不好,使用“请求池”的办法好些,哪个先到 ,哪个先res.send出去

@einsy 是的,队列这个词用的不对

回到顶部