NodeJS / Express 4 - Sqlite3 - 将行集存储到变量中

时间:2014-12-28 23:57:10

标签: node.js express sqlite

我正在尝试将下面查询中的行集存储到变量中,以便我可以将其播放到视图中并循环遍历它。

我从DB获取结果,并且可以在 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;

1 个答案:

答案 0 :(得分:1)

数据库查询以异步方式运行,一旦查询返回就执行回调函数。因此,在res.render设置为空字符串之后,但在将其设置为结果集之前调用data

此外,您不需要JSON.stringify已经构建为JSON的字符串。

代码执行如下:

  1. var data = "";
  2. db.serialize
  3. var rowset = db.each
  4. res.render
  5. 数据库查询返回。
  6. 执行
  7. db.each回调函数,根据结果集设置data
  8. 试试这个:

    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字符串化:

    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
          });
        });
      });
    });