Express.js和Node.js:无法在请求对象中设置值
我正在学习实用Node.js这本书。它基于express.js上的旧版本。这本书试图建立一个博客。它有几个不同的路由文件。Ex-index.js、admin.js、article.js等。这些路由类是从app.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
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