响应呈现Jade并在sqlite3完成查询之前发送

时间:2014-09-04 16:10:51

标签: javascript node.js express sqlite

我正在尝试从sqlite3数据库中获取结果并让它们在jade模板中呈现,但基于我在此代码中放置的日志组合,似乎在等待db查询时呈现模板光洁度。

var express = require('express');
var router = express.Router();
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('test_dab');

/* GET home page. */

var rowResults;


router.get('/', function(req, res) {


    db.get('SELECT ID, first_name, last_name FROM customer WHERE ID = 33', function(err,  row){
        rowResults = 'Hello, ' + row.first_name + ' ' + row.last_name + '!';
        console.log(row);
        console.log(rowResults);
    });


    console.log(rowResults);

    res.render('index', { title: 'Express',
        whatever: rowResults });
});

console.log('Router found index');
module.exports = router;

以下是控制台中的输出:

//on browser refresh...

undefined
GET / 304
{ ID: 22, first_name: 'Bo', last_name: 'Jackson' }
Hello, Bo Jackson!
GET /stylesheets/style.css 304
GET /javascripts/main.js 304

如何在数据库完成之前保持页面不被渲染?

1 个答案:

答案 0 :(得分:3)

db.get方法是异步的。您的工作方式render正在执行db.get之前执行,并设置rowResults变量。

您必须在render方法调用中调用db.get方法:

router.get('/', function(req, res) {
  db.get('SELECT ID, first_name, last_name FROM customer WHERE ID = 33', function(err,  row){
    var rowResults = 'Hello, ' + row.first_name + ' ' + row.last_name + '!';
    res.render('index', { title: 'Express',
    whatever: rowResults });
  });
});