Walcząc z tym przez ostatnią godzinę, nie można tego wymyślać:

app.get('/bk/domains/get', function (req, res) {
   client.keys('*', function (e, d) {
       d.forEach(function (data) {
           client.hgetall(data, function (e, d) {
               res.json({'host': data, 'config': d});
           });
       });
   });
});

Oto przykładowy wyjście:

{
  "host": "test.com",
  "config": {
    "url": "http://test.com/test.html",
    "token": "source",
    "account": "test",
    "source": "google"
  }
}

W tej chwili, z powodu res.json umiera zaraz po wypludzeniu pierwszej wartości od Client.Hgetall. Istnieje około 10 innych wartości, które chciałbym dodać do tej odpowiedzi JSON, ale nie mogę tego działania. Jak mam to zrobić?

Próbowałem tego:

app.get('/bk/domains/get', function (req, res) {
   var arr = [];
   client.keys('*', function (e, d) {
       d.forEach(function (data) {
           client.hgetall(data, function (e, d) {
               arr.push({'host': data, 'config': d});
           });
       });
   });
});

Ale arr jest zawsze pusty. Próbowałem również przenieść arr poza app.get, ponieważ może to być przestrzeń nazw, ale to też nie działa.

Jak mogę nacisnąć 10 wartości z HGetalla w jedną tablicę i zwróć go jako JSON?

Z góry dziękuję!

0
user3068356 5 grudzień 2013, 06:25

2 odpowiedzi

Najlepsza odpowiedź

Prawdopodobnie wpadasz w kwestie ze względu na asynchroniczny charakter metod klienta. Spróbuj tego:

app.get('/bk/domains/get', function (req, res) {
   var arr = [], i = 0, numKeys;
   client.keys('*', function (e, d) {
        numKeys = d.length;
       d.forEach(function (data) {
           client.hgetall(data, function (e, d) {
               arr.push({'host': data, 'config': d});
               i++;
               console.log(arr);
               if(i == numKeys)
                res.json(arr);
           });
       });
   });
});
1
ragamufin 5 grudzień 2013, 02:35

Pochodzi z witryny NodeJS:

var options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, 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);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

Zasadniczo, jak sugerował jeden użytkownik, jest to połączenie asynchowe i musisz czekać, aby pobrać dane, a następnie napisać odpowiednie dane na końcu, więc nie pozostaniesz z niczym odcięciem. W celu uzyskania dalszej dokumentacji Proszę przejrzeć dokumenty.

0
C. S. 5 grudzień 2013, 02:42