2017-02-14 15 views
1

Создал базовое приложение express.js и добавил модель (используя thinky и rethinkdb), пытающуюся передать изменения в файл нефрита и не смог понять, как передать результаты фида. Я понимаю, что changes() возвращает бесконечный курсор. Поэтому он всегда ждет новых данных. Как справиться с этим в выражении res. Любая идея, что мне здесь не хватает?Rethinkdb changesfeed в Express.js с использованием thinky

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; 
+0

Hi Mohammad, я ценю время, чтобы ответить на мой вопрос, но это не сработало. doc все еще не определено. Я должен посмотреть на интеграцию socket.io, чтобы передать его на передний план. Я надеюсь, что следующая версия Express.js будет думать о обновлениях в реальном времени от db. Это важная функция, которую должны учитывать каждая новая структура. – Marco

+0

@marco Если вы добавите console.log MYDOCS прямо перед res.render, вы получите выход? –

+0

Да. Но это тот самый вопрос, который я имел раньше. – Marco