Mongoskin failed to use the collection method.

  mongodb, question

When using Express+NodeJS+MongoDB+MongoSkin to quickly build a web application, reading data failed.
On the premise of opening the database connection and creating a piece of data, I did this:

1: data connection in app.js

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

2: Connect the database to the http request

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

The code for posting app.js is as follows:

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: at. \routes\users.js edit as follows:

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: open the service, after npm start, visithttp://localhost:3000/users/userlist, found that the report was wrong.
The error message is: cannotcallmethod ‘collection’ of undefined.
Looking at the Internet, I found this usage is also possible. Please help me look at it.

The reason is found:

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

Above, I put the value of req.db below. I think it was not instantiated to db when calling req.db, so I reported an error when calling collection later. As for the deeper reasons, I still need to explore. When I wrote it, I felt that the upper and lower positions might not matter much. If there is a friend who can answer this question, please look at it. Thank you very much.