1

私のコードはループの外側で正常に動作します:

var localFolder = '/home/transcripts',
    apiHost = 'https://someserver'
    apiCall = '/path',
    sharedSecret = 'secret';
/* includes */

var sys = require('sys'),
    fs = require('fs'),
    exec = require('child_process').exec,
    querystring = require('querystring'),
    crypto = require('crypto')
    request = require('request');
var file = "index_07_03_2013_1209576.csv";

console.log('Pushing CSV to API: ' + file);
var r = request.post(
    apiHost + '/' + apiCall,
    {   form: {
            'filename': file,
            'accessToken': crypto.createHash('md5').update(file + sharedSecret).digest('hex')
        }
    },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
        console.log(error);
        console.log(response);
    }
);

file = "index_07_02_2013_1548773.csv";

console.log('Pushing CSV to API: ' + file);
var r = request.post(
    apiHost + '/' + apiCall,
    {   form: {
            'filename': file,
            'accessToken': crypto.createHash('md5').update(file + sharedSecret).digest('hex')
        }
    },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
        console.log(error);
        console.log(response);
    }
);

file = "index_07_02_2013_1548773.csv";

console.log('Pushing CSV to API: ' + file);
var r = request.post(
    apiHost + '/' + apiCall,
    {   form: {
            'filename': file,
            'accessToken': crypto.createHash('md5').update(file + sharedSecret).digest('hex')
        }
    },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
        console.log(error);
        console.log(response);
    }
);

ただし、forEach ループに移動しようとすると、サーバーが要求を受信しません。CSV ファイルが API にプッシュされていることを示す出力が表示されますが、リクエストがサーバーに到達していないようです。そのためのコードは次のとおりです。

#!/usr/local/bin/node

/* environment vars */

var localFolder = '/home/transcripts',
    apiHost = 'https://someserver'
    apiCall = '/path',
    sharedSecret = 'secret';

/* includes */

var sys = require('sys'),
    fs = require('fs'),
    exec = require('child_process').exec,
    querystring = require('querystring'),
    crypto = require('crypto')
    request = require('request');

var counter = 0;

fs.readdir(localFolder, function(err, files) {

    files.forEach(function(file) {

        if (file.substr(-3, 3) == 'csv') {


            console.log('Pushing CSV to API: ' + file);
            request.post(
                apiHost + '/' + apiCall,
                {   form: {
                        'filename': file,
                        'accessToken': crypto.createHash('md5').update(file + sharedSecret).digest('hex')
                    }
                },
                function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        console.log(body);
                    }
                    console.log(error);
                    console.log(response);
                }
            );
            console.log(request);

        }

        counter++;

    });

    if (counter >= files.length) {

        process.exit(0);

    }

});

問題が何であるか誰にも考えがありますか?

4

1 に答える 1

0

trueと評価さprocess.exit(0)れるとすぐに実行されるため、ループバージョンが壊れると思います。counter >= files.length

意図した機能が実際に壊れる理由は、おそらく、(非同期の) 呼び出しを非常に高速にスピンオフし、requestそれが完了したらプログラムを終了するためです。私の推測では、実際にはリクエストが完了するまで (つまり、コールバックが完了するまで) 待たないため、プログラムを途中で終了してしまうと思います。

必要なのは基本的に待機グループであり、すべてのコールバックが完了する前にプログラムを終了しないようにする必要があります。

次のようなことを試してください:

// imports, etc
// ...

var counter = 0;

function done() {
  counter--;

  if(counter === 0) {
    process.exit(0);
  }
}

var callback = function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
  console.log(error);
  console.log(response);

  done();
}


fs.readdir(localFolder, function(err, files) {
  counter = files.length;

  files.forEach(function(file) {
    if (file.substr(-3, 3) == 'csv') {
      console.log('Pushing CSV to API: ' + file);
      var data = { 
        form: {
          'filename': file,
          'accessToken': crypto.createHash('md5').update(file + sharedSecret).digest('hex')
        }
      }

      request.post(apiHost + '/' + apiCall, , data, callback);
    }
  }
);
于 2013-07-18T18:48:26.093 に答える