2014-12-28 2 views
0

Я пытаюсь сохранить набор строк из запроса ниже в переменную, чтобы я мог воспроизвести его в представлении и прокрутить его.NodeJS/Express 4 - Sqlite3 - Сохранение набора строк в переменную

Я получаю результаты из БД, и может console.log их в db.each блока, и я думал, что я мог бы генерировать свой объект JSON ниже, а затем сохранить его - но не установить его для некоторых Причина и var data = "" просто возвращает пустую строку.

Я немного озадачен тем, почему - кто-нибудь знает, где я ошибаюсь, пожалуйста?

Спасибо, что нашли время для чтения.

var express = require('express'); 
var router = express.Router(); 
var db  = require('../lib/db.js'); 

/* GET contacts listing. */ 
router.get('/', function(req, res) { 

var data = ""; 

db.serialize(function() { 
    var rowset = db.each("SELECT b.forename, b.surname FROM contacts a, contact_attributes b WHERE a.contact_id = b.contact_id", function(err, row) { 

     data = ' { "'+row.contact_id+'" : [ { "forename" : "'+row.forename+'", "surname" : "'+row.surname+'" } ] } '; 

    }); 
    }); 

    res.render('contacts', { 
    title: "Contacts", 
    active: "contacts", 
    contacts: JSON.stringify(data) 
    }); 
}); 

module.exports = router; 
+0

Является ли это дб вызов синхронизации? –

ответ

1

Запрос базы данных выполняется асинхронно, выполняя функцию обратного вызова после возвращения запроса. Поэтому res.render вызывается после того, как data устанавливается в пустую строку, но до того, как он будет установлен в набор результатов.

Кроме того, нет необходимости в JSON.stringify строке, которую вы уже создали как JSON.

Код выполняется следующим образом:

  1. var data = "";
  2. db.serialize
  3. var rowset = db.each
  4. res.render
  5. DB запрос возвращает.
  6. db.each Выполняется функция обратного вызова, которая устанавливает data на основе набора результатов.

Попробуйте это:

db.serialize(function() { 
    var rowset = db.each("SELECT forename, surname FROM contacts a, contact_attributes b WHERE a.contact_id = b.contact_id", function(err, row) { 

     var data = ' { "'+row.contact_id+'" : [ { "forename" : "'+row.forename+'", "surname" : "'+row.surname+'" } ] } '; 

     res.render('contacts', { 
     title: "Contacts", 
     active: "contacts", 
     contacts: data 
     }); 
    }); 
    }); 
}); 

или избежать ручной JSON stringification:

db.serialize(function() { 
    var rowset = db.each("SELECT forename, surname FROM contacts a, contact_attributes b WHERE a.contact_id = b.contact_id", function(err, row) { 

     var data = {}; 
     data[row.contact_id] = [ 
     { 
      forename: row.forname, 
      surname: row.surname 
     } 
     ]; 

     res.render('contacts', { 
     title: "Contacts", 
     active: "contacts", 
     contacts: data 
     }); 
    }); 
    }); 
}); 
Смежные вопросы