Express.js和Node.js:无法在请求对象中设置值

Express.js和Node.js:无法在请求对象中设置值,node.js,express,Node.js,Express,我正在学习实用Node.js这本书。它基于express.js上的旧版本。这本书试图建立一个博客。它有几个不同的路由文件。Ex-index.js、admin.js、article.js等。这些路由类是从app.js调用的。例: app.use('/', routes.index);//// THE ISSUE IS HERE ///// app.get('/login', routes.user.login); app.post('/login', routes.user.authenticat

我正在学习实用Node.js这本书。它基于express.js上的旧版本。这本书试图建立一个博客。它有几个不同的路由文件。Ex-index.js、admin.js、article.js等。这些路由类是从app.js调用的。例:

app.use('/', routes.index);//// THE ISSUE IS HERE /////
app.get('/login', routes.user.login);
app.post('/login', routes.user.authenticate);
app.get('/logout', routes.user.logout);
app.get('/admin',  routes.article.admin);
app.get('/post',  routes.article.post);
app.post('/post', routes.article.postArticle);
每当有人试图访问“/”时,我都会在请求对象中设置文章和用户的集合对象

var dbarticles = require('./db/articles.json');
var dbusers = require('./db/users.json');
app.use(function(req, res,next) {
  if (!collections.articles || ! collections.users) return next(new Error("No collections."))
  req.collections = collections;
  return next();
});

 app.use('/', routes.index);//// THE ISSUE IS HERE /////
问题是在index.js文件中,req.collections的值不可用,我得到了“undefined”。我错过了什么。我已在console.log中检查,该值在命中“/”route.index之前存在于req.collections中

这是我的app.js

    var express = require('express');
var router = express.Router();
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var  methodOverride = require('method-override');
var routes = require('./routes');
var dbarticles = require('./db/articles.json');
var dbusers = require('./db/users.json');
 var collections = {
    articles: dbarticles,
    users: dbusers
  };
var logger = require('morgan');
 var errorHandler = require('errorhandler');
 var app = express();  

app.locals.appTitle = 'blog-express';

//console.log(collections.articles || collections.users);



app.use(function(req, res,next) {
  if (!collections.articles || ! collections.users) return next(new Error("No collections."))
  req.collections = collections;
  return next();
});



// 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());
app.use(methodOverride());
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));

// Pages and routes
app.use('/', routes.index);

app.get('/login', routes.user.login);
app.post('/login', routes.user.authenticate);
app.get('/logout', routes.user.logout);
app.get('/admin',  routes.article.admin);
app.get('/post',  routes.article.post);
app.post('/post', routes.article.postArticle);
app.get('/articles/:slug', routes.article.show);

// REST API routes
app.get('/api/articles', routes.article.list);
app.post('/api/articles', routes.article.add);
app.put('/api/articles/:id', routes.article.edit);
app.delete('/api/articles/:id', routes.article.del);



app.all('*', function(req, res) {
  res.sendStatus(404);
})
// catch 404 and forward to error handler


// error handlers

// development error handler
// development only
if ('development' == app.get('env')) {
  app.use(errorHandler());
}

// production error handler
// no stacktraces leaked to user


//module.exports = router;
module.exports = app;
这是我的index.js

exports.article = require('./article');
exports.user = require('./user');

/*
 * GET home page.
 */

exports.index = function(req, res, next){
    console.log(".." + res.collections);
  req.collections.articles.find({published: true}, {sort: {_id:-1}}).toArray(function(error, articles){
    if (error) return next(error);
    res.render('index', { articles: articles});
  })
};
如果有人需要查看本书的代码库,请检查此github url-
https://github.com/azat-co/practicalnode/tree/master/ch5/blog-express

尝试将
app.use('/',routes.index)
更改为
app.get('/',routes.index)

如果这不起作用,请尝试将中间件设置为内联

var setCollections  = function (req, res,next) {
  if (!collections.articles || ! collections.users) return next(new Error("No collections."))
  req.collections = collections;
  return next();
}

app.get('/', setCollections, routes.index)

我想这应该行得通。要进行诊断,请尝试在定义
app.get('/',…)
之前,将设置
req.collections
req.use(…)
向下移动?在该方法中,在将其分配给
req.collection
之前,请验证
collections
是否已定义。如果这是一个没有什么重要意义的启动项目,您能否将其提交给GitHub public rep,我可以尝试克隆,看看是否能找到问题?以后可以删除回购。所有解决方案均无效。第二种解决方案将代码挂起很长一段时间,然后过了一段时间,我出现了这个错误。致命错误:调用和重试上次分配失败-进程内存不足中止陷阱:6