Javascript 有时车把不会加载对象

Javascript 有时车把不会加载对象,javascript,node.js,express,handlebars.js,Javascript,Node.js,Express,Handlebars.js,我正在尝试使用res.render传递的对象创建div。但是,如果刷新页面,有时会创建div,有时不会创建div。我也使用引导 js/express: router.get('/', checkSignIn, function(req, res, next) { db = new sqlite3.Database(file); var tasks = {}; db.serialize(function () { var query = "SELECT ta

我正在尝试使用res.render传递的对象创建div。但是,如果刷新页面,有时会创建div,有时不会创建div。我也使用引导

js/express:

router.get('/', checkSignIn, function(req, res, next) {
    db = new sqlite3.Database(file);
    var tasks = {};
    db.serialize(function () {
        var query = "SELECT tasks.id, tasks.name, tasks.status FROM tasks JOIN users ON users.privilege = tasks.privilege WHERE users.id = '" + req.session.userid + "'";
        db.all(query, function (err, rows) {
            for(i = 0; i < rows.length; i++) {
                tasks[i] = {
                    name: rows[i].name,
                    status: rows[i].status
                };
                console.log(tasks[i]);
            }
        });
    });
    db.close();
    res.render('index', {
        title: 'Home',
        css: ['style.css', 'dist/wu-icons-style.css'],
        username: req.session.username,
        tasks: tasks
    });
});
哈佛商学院:

根据我添加的console.log,tasks对象每次都会正确填充。所以我认为问题在于车把


我在这里找到了一个解决方案:,但我不使用这个。我试过了./name和./status,但没用。有人能帮我吗?

您的问题是异步javascript,而不是手柄。您的tasks对象正在填充,但在此之前您正在呈现html。如果您将console.logtasks放在db.close的当前位置之后,它将是一个空对象。您需要在数据库调用中移动render函数:

router.get('/', checkSignIn, function(req, res, next) {
    db = new sqlite3.Database(file);
    db.serialize(function () {
        var query = "SELECT tasks.id, tasks.name, tasks.status FROM tasks JOIN users ON users.privilege = tasks.privilege WHERE users.id = '" + req.session.userid + "'";
        db.all(query, function (err, rows) {
            var tasks = {};
            for(i = 0; i < rows.length; i++) {
                tasks[i] = {
                    name: rows[i].name,
                    status: rows[i].status
                };
                console.log(tasks[i]);
            }
            res.render('index', {
                title: 'Home',
                css: ['style.css', 'dist/wu-icons-style.css'],
                username: req.session.username,
                tasks: tasks
            });
        });
    });
    db.close();
});

很抱歉迟了回复,但是谢谢你的回答。成功了。但是,在db.all中移动db.close会产生错误。因此,我只在db.all函数中移动了res.render,这很有效。所以它不工作,因为它在上一个函数完成之前就开始渲染了,对吗?
router.get('/', checkSignIn, function(req, res, next) {
    db = new sqlite3.Database(file);
    db.serialize(function () {
        var query = "SELECT tasks.id, tasks.name, tasks.status FROM tasks JOIN users ON users.privilege = tasks.privilege WHERE users.id = '" + req.session.userid + "'";
        db.all(query, function (err, rows) {
            var tasks = {};
            for(i = 0; i < rows.length; i++) {
                tasks[i] = {
                    name: rows[i].name,
                    status: rows[i].status
                };
                console.log(tasks[i]);
            }
            res.render('index', {
                title: 'Home',
                css: ['style.css', 'dist/wu-icons-style.css'],
                username: req.session.username,
                tasks: tasks
            });
        });
    });
    db.close();
});