1

mongoskin を介して mongodb からデータを読みたかったのです。しかし、localhost:3000/tasks を呼び出そうとすると、nodejs がエラーをスローします。

私のデータベース「todo」には、コレクション「タスク」にいくつかのアイテムがあります。アプリを起動すると、コンソールの結果は正常に機能します。

私が何か間違ったことを書いた場所を誰かが見ることができますか?

エラー メッセージ:

500 TypeError: Cannot read property 'tasks' of undefined
at exports.list (/Users/piet/Websites/privat/mongo/routes/tasks.js:7:8) at callbacks     (/Users/piet/Websites/privat/mongo/node_modules/express/lib/router/index.js:164:37)
at param (/Users/piet/Websites/privat/mongo/node_modules/express/lib/router/index.js:138:11)
at pass (/Users/piet/Websites/privat/mongo/node_modules/express/lib/router/index.js:145:5)
at Router._dispatch    (/Users/piet/Websites/privat/mongo/node_modules/express/lib/router/index.js:173:5)
at Object.router   (/Users/piet/Websites/privat/mongo/node_modules/express/lib/router/index.js:33:10)
at next   (/Users/piet/Websites/privat/mongo/node_modules/express/node_modules/connect/lib/proto.js:193:    15)
at Object.methodOverride [as handle]  (/Users/piet/Websites/privat/mongo/node_modules/express/node_modules/connect/lib/middleware/me    thodOverride.js:48:5)
at next (/Users/piet/Websites/privat/mongo/node_modules/express/node_modules/connect/lib/proto.js:193:    15)
at Object.urlencoded [as handle]   (/Users/piet/Websites/privat/mongo/node_modules/express/node_modules/connect/lib/middleware/ur    lencoded.js:49:37)

私のapp.js:

var express = require('express');
var routes = require('./routes');
var tasks = require('./routes/tasks');
var http = require('http');
var path = require('path');

var mongo = require("mongoskin");
var db = mongo.db('localhost:27017/todo?auto_reconnect=true', { 
safe:true })
.collection('tasks')
.find()
.toArray(function(error, items){
    console.log(items);
})

var app = express();
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

if ('development' == app.get('env')) {
   app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/tasks', tasks.list);
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

/routes/tasks.js の下のルート ファイル

exports.list = function(req, res, next){
req.db.tasks.find({
    completed: false
}).toArray(function(error, tasks){
    res.render('tasks', {
        title: "ToDo list",
        name: tasks = tasks || []
    })
})
};
4

3 に答える 3

2

ポート ID として 28017 を使用します。「req.db」で何が得られているかを確認できます。多分これは未定義です。

于 2013-11-26T09:45:09.673 に答える
2

コレクション オブジェクトをリクエストに接続するには、ミドルウェアが必要になります。

var db    = mongo.db('localhost:27017/todo?auto_reconnect=true');
var tasks = db.collection('tasks');
...
app.use(function(req, res, next) {
  req.db = { tasks : tasks }; // this exposes the collection as `req.db.tasks`
                              // to your route handlers
  next();
});
app.use(app.router);
...
于 2013-11-26T10:53:10.023 に答える
1

routes/task.js では、req は Express.js のリクエスト オブジェクトです。「db」ハンドルがないため、エラーが発生しています。

500 TypeError: Cannot read property 'tasks' of undefined

app.js では、これは db ハンドルを取得する間違った方法です。

var mongo = require("mongoskin");
var db = mongo.db('localhost:27017/todo?auto_reconnect=true', { safe:true })
   .collection('tasks')
   .find()
   .toArray(function(error, items){
       console.log(items);
   });

db コードは別のモジュール (たとえば dbConnection.js) に移動して、db ハンドルが必要になるたびに次のようにする必要があります。

var db = require('./dbConnection').getDb();

routes/task.js は、データベース呼び出しを行うために db ハンドルを取得する必要があります。改訂された app.js、routes/task.js、および新しい dbConnection.js ファイルは次のとおりです。

dbConnection.js:

var open = function() {
    return require('mongoskin').db('localhost:27017/todo?auto_reconnect=true',
        {safe: true, strict: false}
    );
};

var db = open();

var dbConnection = {
    getDb: function() {
        if (!db) {
           db = open();
        }
        return db;
    }
};

module.exports = dbConnection;

ルート/task.js:

var db = require('../dbConnection').getDb();

exports.list = function(req, res, next){
    var tasksCollection = db.collection('tasks');

    tasksCollection.find({ completed: false }).toArray(function(error, tasks){
        res.render('tasks', {
            title: "ToDo list",
            name: (tasks || [])
        });
    });
};

app.js:

var express = require('express');
var routes = require('./routes');
var tasks = require('./routes/tasks');
var http = require('http');
var path = require('path');

var app = express();
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/tasks', tasks.list);
http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});
于 2013-11-26T11:34:18.353 に答える