错误:未来解决了不止一次

时间:2015-10-23 17:49:20

标签: angularjs node.js express

当我第一次在浏览器上运行我的角度应用程序时,一切正常。但是,当我刷新页面时,我收到了以下错误消息。

  

/.../ node_modules /纤维/ future.js:248

      throw new Error('Future resolved more than once');
            ^
Error: Future resolved more than once
    at Object.Future.return (/.../node_modules/fibers/future.js:248:10)
    at IncomingMessage.<anonymous> (/.../server.js:38:34)
    at IncomingMessage.emit (events.js:95:17)
    at IncomingMessage.<anonymous> (_stream_readable.js:765:14)
    at IncomingMessage.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:427:10)
    at emitReadable (_stream_readable.js:423:5)
    at readableAddChunk (_stream_readable.js:166:9)
    at IncomingMessage.Readable.push (_stream_readable.js:128:10)
    at HTTPParser.parserOnBody [as onBody] (http.js:143:22)

我的server.js

中有以下代码
var Fiber = require('fibers/future');  
var future = new Fiber;

function getNodeList(method){  
    ...  
    ...  
    ...  
    var req = https.request(options, function(res) {  
        var nodesList;  
        if (res.statusCode === 200) {  
            res.on('data', function(d) {  
                // process.stdout.write(d);  
                if (Buffer.isBuffer(d)) {  
                    nodesList = JSON.parse(d.toString('utf-8'));  
                    future.return(nodesList); <---Error Happen Here 
                }  
            });  
        } else {  
            console.log("ERROR");  
        }  
    });  
}  
app.post('/viewNodeList', function(req, res) {  
    var object = getNodeList("GET");  
    console.log("this One!");  
    res.status(200).send(object);  
}.future());  

1 个答案:

答案 0 :(得分:0)

res对象是readable stream,可以在多个块中接收其数据,每个块都在单独的'data' event中提供。

您还希望同时监听'end' event,每个流最多只能发生一次,以了解何时收到所有数据块。

    if (res.statusCode === 200) {  
        let chunks = [];
        let totalLength = 0;

        res.on('data', function(chunk) {  
            totalLength += chunk.length;
            chunks.push(chunk);
        });  

        res.on('end', function () {
            var body = Buffer.concat(chunks, totalLength);
            nodeList = JSON.parse(body.toString());
            future.return(nodesList);
        });
    } // ...

您还需要为new Future的每次使用创建getNodeList()

var Fiber = require('fibers/future');

function getNodeList(method){
    var future = new Future;

    // ...
}

通过在脚本顶部创建它,每个请求只能存在一个Future。并且,一旦它被第一个请求设置为完成,那么之后就不能再为其他请求重用。