recherche

Maison  >  Questions et réponses  >  le corps du texte

mongodb - mongoskin 使用collection方法失败

在使用EXPRESS + NODEJS + MONGODB + MONGOSKIN来快速搭建web应用的时候,读取数据失败。
在打开数据库连接,创建了一条数据的前提下,我是这样做的:

1:在app.js中数据连接

// Database
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/learn3", {native_parser:true});

2:让数据库连接到http请求上

// Make our db accessible to our routerapp.use(function(req,res,next){
req.db = db;
next();
});

贴出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');
// Database
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/learn3", {native_parser:true});

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

var app = express();

// 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(express.static(path.join(__dirname, 'public')));

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

// Make our db accessible to our router
app.use(function(req,res,next){
    req.db = db;
    next();
});

// 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: {}
    });
});


module.exports = app;

3:在.\routes\users.js 编辑如下:

var express = require('express');
var router = express.Router();

/**
 * GET userlist.
 */
router.get('/userlist', function(req, res) {
    var db = req.db;
    db.collection('userlist').find().toArray(function(err, items) {
        res.json(items);
    })
  // res.send('respond with a resource');
});

module.exports = router;

4:打开服务,npm start 后,访问http://localhost:3000/users/userlist,发现报错了。
错误提示是:Cannot call method 'collection' of undefined。
查看网络,发现这样的用法也是可以的,请各位路过的仁兄帮忙看看呗。

伊谢尔伦伊谢尔伦2765 Il y a quelques jours530

répondre à tous(1)je répondrai

  • 巴扎黑

    巴扎黑2017-04-24 09:15:59

    La raison est trouvée :

    // Make our db accessible to our router
    app.use(function(req,res,next){
        req.db = db;
        next();
    });    
    app.use('/', routes);
    app.use('/users', users);
    

    J'ai mis la valeur de req.db ci-dessous. Je pense que c'est parce qu'il n'a pas été instancié dans db lors de l'appel de req.db, donc une erreur a été signalée lors de l'appel de collection plus tard. Quant aux raisons plus profondes, je dois encore les explorer. Quand je l’ai écrit, j’ai senti que les positions supérieure et inférieure n’avaient peut-être pas beaucoup d’importance. Si quelqu'un peut y répondre, aidez-moi, merci beaucoup.

    répondre
    0
  • Annulerrépondre