【问题标题】:Response renders Jade and is sent before sqlite3 finishes query响应呈现 Jade 并在 sqlite3 完成查询之前发送
【发布时间】:2014-10-29 11:40:10
【问题描述】:

我正在尝试从 sqlite3 数据库中获取结果并将它们呈现在玉模板中,但基于我放置在此代码中的日志组合,似乎模板在等待 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

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

【问题讨论】:

    标签: javascript node.js express sqlite


    【解决方案1】:

    db.get 方法是异步的。按照您的做法,renderdb.get 返回并设置rowResults 变量之前执行。

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      相关资源
      最近更新 更多