【问题标题】:NodeJS / Express 4 - Sqlite3 - Storing rowset into variableNodeJS / Express 4 - Sqlite3 - 将行集存储到变量中
【发布时间】:2023-04-06 23:42:01
【问题描述】:

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

我正在从数据库中获取结果,并且可以将它们 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;

【问题讨论】:

  • 这是同步数据库调用吗?

标签: node.js express sqlite


【解决方案1】:

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

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

代码执行如下:

  1. var data = "";
  2. db.serialize
  3. var rowset = db.each
  4. res.render
  5. 数据库查询返回。
  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 字符串化:

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

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2012-11-19
    • 2019-03-23
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2012-03-20
    相关资源
    最近更新 更多