2017-02-17 10 views
1

私はexpress.js、rethinkdb、thinky、socket.ioを使用しています。 db内で発生した変更をインデックスページに通知しようとしています。ですから、私はrethinkdb changesfeedを使用します(そして、console.logの更新を見ることができます)が、カーソル/フィードはデータの代わりにオブジェクトオブジェクトを表示しています。rethinkdbはsocket.ioで明示的に変更しました[オブジェクトオブジェクト]

私はフィード結果をsocket.emitに渡すと、[object object]が表示されますか? rethinkdbブログ(https://www.rethinkdb.com/blog/cats-of-instagram/)のコードを読み込んで実装しましたが、機能しません。 itemはとてもおそらくオブジェクトであることを

console.log(item); 
//if (item && item.new_val) 
socket.emit("message-from-server", { greeting: item }); 

これは私に語った:

socket.ioヘッダ

App.jsコードから

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var r = require('rethinkdb'); 

// *********** Thinky code*********************// 
var changeStream = require("rethinkdb-change-stream"); 
var thinky = require('thinky')() 
var type = thinky.type; 
var r = thinky.r; 

//thinky model 
var User = thinky.createModel('User', { 
     author: type.string() 
}); 

/* 
User.changes().then(function (feed) { 
    feed.each(function (error, doc) { 
     if (error) { 
      console.log(error); 
      process.exit(1); 
     } 

     if (doc.isSaved() === false) { 
      console.log("The following document was deleted:"); 
      console.log(JSON.stringify(doc)); 
     } 
     else if (doc.getOldValue() == null) { 
      console.log("A new document was inserted:"); 
      console.log(JSON.stringify(doc)); 
     } 
     else { 
      console.log("A document was updated."); 
      console.log("Old value:"); 
      console.log(JSON.stringify(doc.getOldValue())); 
      console.log("New value:"); 
      console.log(JSON.stringify(doc)); 
     } 
    }); 
}).error(function (error) { 
    console.log(error); 
    process.exit(1); 
}); 

*/ 
//*********End Thinky Code ******************// 




// Mongodb Example http://www.guru99.com/node-js-mongodb.html 
var MongoClient = require('mongodb').MongoClient 
var url = 'mongodb://localhost/EmployeeDB'; 


var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 
//attach socket server to express server so it interacts with clients requests and responses 
app.io = require('socket.io')(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(require('stylus').middleware(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function (err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function (err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 


/* )))))))))))))))) socket.io Header ((((((((((((((((((( */ 

    app.io.on('connection', function (socket) { 
     r.connect(host = 'localhost', port = 28015, db = 'test').then(function (conn) { 
      this.conn = conn; 
      return r.table("User").changes().run(this.conn).then(function (cursor) { 
       cursor.each(function (err, item) { 
        console.log(item); 
        //if (item && item.new_val) 
         socket.emit("message-from-server", { greeting: item }); 
       }); 
      }) 
     }); 
     // socket.emit("message-from-server", { greeting: "Say whatever here- it will show on the index page"}); 
    }); 


    module.exports = app; 

答えて

1

で一番下までスクロールしてくださいDOMに追加するためにWeb APIに渡すと、オブジェクト参照である文字列(オブジェクトではない)を期待しているため、オブジェクト参照[object Object]がレンダリングされます。だから、itemから、オブジェクトの場合は.の構文、配列の場合は[<index>]の構文を使用して、必要な情報を引き出すことができます。item.toString()のように、文字列に変換することができます。これは実際にはitemの構造とDOMにどのように追加するかによって異なります。あなたはそれをクライアント側で行うこともできますし、サーバーから放出される前に行うこともできます。

+0

ありがとうございますJ3py。私はあなたの説明でそれを働かせることができました。 – Marco

+0

@Marco素晴らしい!お役に立てて嬉しいです :) – j3py

関連する問題