Node JS承诺不在本地服务器上工作

时间:2015-12-02 23:44:01

标签: node.js promise q

我创建了“小”服务器,它使用NodeJs并承诺从给定目录中复制和压缩给定类型的文件。它必须是separeted,每个都在承诺 - 阅读文件并打包它们。首先,我创建了那些承诺,以检查它们是否有效,并且他们做了:

function packFile(file){
    var fileName = path.basename(file);
    console.log('   (+) Add to the archive : ' + fileName + ' ['+file+']');
    archive.append(fs.createReadStream(file), { name:fileName });
}

Q.nfcall(recursive, pathGiven, filterGiven)         
.then(function(data) {                                  
    var chain = Q.when();   
for(var i = 0; i < data.length; i++){   
    console.log(' > '+data[i]+' > adding to chain ...');
    chain = chain.then(packFile.bind(this, data[i]));
}

chain.then(function() {
    archive.finalize();
}); 

Ofc,我补充说,在前面提到的代码前面:

fs = require('fs');
archiver = require('archiver');
Q = require('q');
recursive = require('recursive-readdir');
path = require('path');

所有这些都是安全的,工作正常。 “存档”也在开始时正确初始化。

由于所有工作 - 现在是时候开始使用服务器了:

//Lets require/import the HTTP module
var http = require('http');

//Lets define a port we want to listen to
const PORT=8080; 

//Create a server
var server = http.createServer(handleRequest);

//Lets start our server
server.listen(PORT, function(){
    console.log("Server listening on: http://localhost:%s", PORT);
});

函数“handleRequest”非常大,所以为了得到它的要点,我将把部分放在哪里处理这些承诺:

switch(request.url) {
    case '/formhandler': 
        if (request.method == 'POST') {     
        // (...) Got my "Sour" (Path to source directory ) and "Mask"
        // Here i tried to place that promise chain, but server just skipped it and continued

        Q.nfcall(recursive, Sour, Mask)         
        .then(function(data) {                                  
            var chain = Q.when();   
            for(var i = 0; i < data.length; i++){   
                console.log(' > '+data[i]+' > adding to chain ...');
                chain = chain.then(packFile.bind(this, data[i]));
            }
            chain.then(function() {
                console.log("whole chain resolved");
                console.log('FINISHING');
                archive.finalize();
            });         
        });

        // (...) Finishing this request
        }
    break;
}

我所做的一切似乎都无法奏效。只要我使用这些承诺(称之为或某些功能)。我不明白为什么。

编辑1 我的意思是跳过 - 我在该处理程序中的promises之前和之后放置了2个console.log。我看到了:

 LOG1
 TEXT_FROM_PROMISES //Something those promises send to console.log
 LOG2

但只有:

 LOG1
 LOG2

服务器已准备好接受另一个请求。

编辑2 一些人建议在评论中更改packFile以便它会返回promise,所以我做了:

function packFile(file){
    return new Promise(function(resolve,reject){
        var fileName = path.basename(file);
        console.log('   (+) Adding to the archive : ' + fileName + ' ['+file+']');
        archive.append(fs.createReadStream(file), { name:fileName });           
    });
}

其余代码不变。结果是 - 现在只有来自这个链的第一个(如果我在脚本中单独称它为“没有服务器”)它仍然无法在服务器上运行。

编辑3

我再次改变了'packFile':

function packFile(file){
    return new Promise(function(resolve,reject){
        var fileName = path.basename(file);
        console.log('   (+) Adding to the archive : ' + fileName + ' ['+file+']');
        archive.append(fs.createReadStream(file), { name:fileName });   
        resolve("Success!");            
    });
}

不是整个链都可以工作 - 对于无服务器版本,但仍然 - 服务器上没有任何事情发生。

编辑4 我改变了

    Q.nfcall(recursive, pathGiven, filterGiven)         
    .then(function(data) {                                  
        var chain = Q.when();   
        for(var i = 0; i < data.length; i++){   
            console.log(' > '+data[i]+' > adding to chain ...');
            chain = chain.then(packFile.bind(this, data[i]));
        }
        chain.then(function() {
            console.log("whole chain resolved");
            archive.finalize(); 
        });         
    }, function(reason) {
        console.log("ERROR:"+reason); // Error!
    });

并在控制台中出现了一些新错误:

ERROR:TypeError: ignores.map is not a function

编辑5 代码我用于存档,只是为了制作和打开.zip来添加文件到我的'packFile'

    archive = archiver.create('zip', {});
    var output = fs.createWriteStream('./output.zip');
    archive.pipe(output);  

编辑6 由于似乎需要更多代码,tehre是我在服务器上调用的功能,只要我收到正确的请求( - &gt;检查此帖子的开头)

    function handleWithPromises(pathGiven, filterGiven){
        console.log('  > Promising ...');

        archive = archiver.create('zip', {});
        var output = fs.createWriteStream('./output.zip');
        archive.pipe(output);  

        function packFile(file){
            return new Promise(function(resolve,reject){
                var fileName = path.basename(file);
                console.log('   (+) Adding to the archive : ' + fileName + ' ['+file+']');
                archive.append(fs.createReadStream(file), { name:fileName });   
                resolve("Success!");            
            });
        }

        Q.nfcall(recursive, pathGiven, filterGiven)         
        .then(function(data) {                                  
            var chain = Q.when();   
            for(var i = 0; i < data.length; i++){   
                console.log(' > '+data[i]+' > adding to chain ...');
                chain = chain.then(packFile.bind(this, data[i]));
            }
            chain.then(function() {
                console.log('FINISHING');
                archive.finalize();
            });         
        });
    }

和代码放在脚本的最前面:

    fs = require('fs');
    archiver = require('archiver');
    Q = require('q');
    recursive = require('recursive-readdir');
    path = require('path');

1 个答案:

答案 0 :(得分:1)

返回编辑1 您希望看到的地方

LOG1
TEXT_FROM_PROMISES //Something those promises send to console.log
LOG2

但得到了

LOG1
LOG2

解释是,在调用then的线程执行完成之后,A + compliance promises与事件循环调度程序接口,以在自己的线程中执行then提供的函数。

链接的promises与定义它们的代码异步执行。

在一个非常简单的层面上,您需要推迟结束请求,直到所有文件都已打包为止,确保response在最后一个匿名函数的函数范围内,并在那里结束响应:

       chain.then(function() {
            console.log('FINISHING');
            archive.finalize();
            response.write(...)   // are you sending the archive back?
            response.end();     // now end the request
        });