Rethinkdb изменяет подачу в Express.js с помощью thinky

Создал базовое приложение express.js и добавил модель (используя thinky и rethinkdb), пытающуюся передать ленту изменений в файл Jade и не в состоянии понять, как передать результаты ленты. Насколько я понимаю, change () возвращает бесконечный курсор. Так что всегда ждем новых данных. Как справиться с этим в экспресс рез. Есть идеи, что мне здесь не хватает?

    var express = require('express');
var router = express.Router();
var thinky = require('thinky')();
var type = thinky.type;
var r = thinky.r;

var User = thinky.createModel('User', {
    name: type.string()   
});
//end of thinky code to create the model


// GET home page. 
router.get('/', function (req, res) {
    var user = new User({name: req.query.author});
    user.save().then(function(result) {      
        console.log(result);
    });
    //User.run().then(function (result) {
        //res.render('index', { title: 'Express', result: result });
    //});
    User.changes().then(function (feed) {
        feed.each(function (err, doc) { console.log(doc);}); //pass doc to the res
        res.render('index', { title: 'Express', doc: doc}) //doc is undefined when I run the application. Why?
    });
    });
module.exports = router;

1 ответ

Решение

Проблема, с которой, я полагаю, вы сталкиваетесь, заключается в том, что feed.eachэто цикл, который вызывает функцию для каждого элемента, содержащегося в ленте. Таким образом, чтобы получить доступ к doc содержалась в console.log(doc) вам нужно будет либо поместить свой код в функцию, в которой doc существует (находится в области видимости переменной doc), или вам нужно будет создать глобальную переменную для хранения значений документа.

Так, например, предполагая, doc это строка и что вы хотите разместить все docв массиве. Вы должны начать с создания переменной, которая имеет res.render в, который для этого примера будет MYDOCS, Затем вам нужно будет добавить каждый документ к нему, и после этого вы просто будете использовать MYDOC каждый раз, когда пытаетесь получить доступ к документу за пределами feed.each функция.

var MYDOCS=[];
User.changes().then(function (feed){
    feed.each(function (err, doc) { MYDOCS.push(doc)});
});
router.get('/', function (req, res) {
    var user = new User({name: req.query.author});
    user.save().then(function(result) {      
        console.log(result);
    });
    //User.run().then(function (result) {
        //res.render('index', { title: 'Express', result: result });
    //});
        res.render('index', { title: 'Express', doc: MYDOCS[0]}) //doc is undefined when I run the application. Why?
    });
module.exports = router;
Другие вопросы по тегам