2014-11-25 4 views
0

Так что, играя с узлом, подумал, что я напишу прямолинейный новостной тикер, чтобы поставить на мою минималистическую страницу узла, казалось, было весело. Дело в том, что я продолжаю получатьСтранный «RangeError: превышен максимальный размер стека вызовов»

RangeError: Maximum call stack size exceeded 

Но я не могу на всю жизнь выяснить, где происходит ошибка. Высказывались некоторые дополнительные отладочные комментарии, даже удаленные части почти каждого файла, но все сводится к одному и тому же. Если я запустил приложение, он без проблем справится с прослушиванием на порту 3000. Если я попытаюсь получить к нему доступ, я получу сообщение об ошибке выше. Вот код app.js

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , mongo = require('mongodb') 
    , logger = require('express-logger') 
    , bodyParser = require('body-parser') 
    , methodOverride = require('express-method-override') 
    , errorhandler = require('errorhandler') 
    , monk = require('monk'); 






var app = express(); 

//Is this specifically for nib and stylus to work 
function compile(str, path) { 
    return stylus(str) 
    .set('filename', path) 
    .use(nib()) 
    } 
// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
//app.use(express.favicon()); 
//app.use(express.logger('dev')); 
//app.use(express.bodyParser()); 
//app.use(express.methodOverride()); 
app.use(app.router); 
app.use(stylus.middleware(
    { src: __dirname + '/public' 
     , compile: compile 
    } 
)); 
app.use(express.static(path.join(__dirname, 'public'))); 

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

//Lets do some stuff to get info from the database 

var db = monk('localhost:27017/meetallnews'); 
var router = express.Router(); 
//Make our db accessible to our router 
app.use(function(req,res,next){ 
req.db = db; 
next(); 
}); 
app.get('/', routes.index); 
app.get('/users', user.list); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Кроме того, маршруты/index.js

console.log('Called index.routes'); 
var express = require('express'); 
var router = express.Router(); 
exports.index = function(req, res){ 
    console.log('render page'); 
    res.render('index', { title: 'Meet All' }); 
}; 

//This is to read from the database 
router.get('/userlist', function(req, res) { 
    console.log('Called database'); 
    var db = req.db; 
    var collection = db.get('sitenews'); 
    collection.find({},{},function(e,docs){ 
     res.render('newslist', { 
      "newslist" : docs 
     }); 
    }); 
}); 

Любые предложения приветствуются, даже там, где начать смотреть. Я удалил весь раздел route.get выше и все равно получил ту же (или идентичную) ошибку. Пытался удалить материал из файла нефрита, в том объеме, в котором осталась только строка заголовка, все еще такое же сообщение об ошибке. И всегда после того, как сервер достиг конца app.js (сказал Сервер на порту 3000)

+1

1. В какой версии Express вы используете? Вы используете маршрутизаторы, которые являются функциями express4, но при в то же время у вас есть 'app.use (app.router)', который устарел в этой версии. 2. Запрос, какой url вызывает ошибку 3. Является ли есть ли трассировка стека с ошибкой? 4. Можете ли вы предоставить источник наименьшей версии приложения (без всего, что вы говорите, что вы удалили), который все еще дает вам ошибку? – lukaszfiszer

+1

трассировка стека будет огромной, но 5) попробовали ли вы заменить res.render (...) простым псевдонимом 'res.json ({})', так что не имеет значения, что происходит до него , а затем комментируя весь код перед этим, раскомментируя их один за другим, пока не нажмете бесконечную рекурсию? потому что тогда вы будете знать, что * вызывает ошибку. –

ответ

0

Большое спасибо lukaszfiszer и Mr Pomax.

Оказывается, что сообщение об ошибке было немного обманчивым, заставив меня подумать, что это какая-то вечная петля или какой-то странный материал из базы данных.

Это было потому, что я ужасный вор и украл код где-то на маршруты, и пропавший без вести, чтобы удалить строку app.use(app.router);, когда также имея routes = require('./routes')

После того, который был удален, я получил новую ошибку бренда, что я понимаю, где он исходит и что он (и не имеет отношения к этой проблеме, только доказывает, что непроверенный код должен быть протестирован.