2011-11-20 24 views
1

我剛開始進入node.js,並在node.js上跟着這個偉大的教程Howtonode,express和mongod。不過,我似乎收到了其他人在評論中沒有提到的錯誤。最新的評論大約在一個月前,所以也許代碼已經過時了?Node.js錯誤:對象函數沒有方法

問題是,當我訪問http://localhost:3000/時,頁面顯示Internal Server Error,並在終端中,我收到下面的錯誤消息。有誰知道發生了什麼?

這裏的錯誤消息:

TypeError: Object function(){} has no method 'findAll' 
    at Router.<anonymous> (/Users/x/nodejs/howtonode/blog/app.js:30:18) 
    at done (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:250:22) 
    at middleware (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:244:9) 
    at param (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:227:11) 
    at pass (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:232:6) 
    at Router._dispatch (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:255:4) 
    at Object.handle (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:45:10) 
    at next (/Users/x/nodejs/howtonode/blog/node_modules/express/node_modules/connect/lib/http.js:203:15) 
    at Object.handle (/Users/x/nodejs/howtonode/blog/node_modules/stylus/lib/middleware.js:187:7) 
    at next (/Users/x/nodejs/howtonode/blog/node_modules/express/node_modules/connect/lib/http.js:203:15) 
TypeError: Object function(){} has no method 'findAll' 
    at Router.<anonymous> (/Users/x/nodejs/howtonode/blog/app.js:30:18) 
    at done (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:250:22) 
    at middleware (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:244:9) 
    at param (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:227:11) 
    at pass (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:232:6) 
    at Router._dispatch (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:255:4) 
    at Object.handle (/Users/x/nodejs/howtonode/blog/node_modules/express/lib/router/index.js:45:10) 
    at next (/Users/x/nodejs/howtonode/blog/node_modules/express/node_modules/connect/lib/http.js:203:15) 
    at Object.handle (/Users/x/nodejs/howtonode/blog/node_modules/stylus/lib/middleware.js:187:7) 
    at next (/Users/x/nodejs/howtonode/blog/node_modules/express/node_modules/connect/lib/http.js:203:15) 

app.js

var express = require('express'); 
var ArticleProvider = require('./articleprovider-memory').ArticleProvider; 

var app = module.exports = express.createServer() 

// Configuration 
app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(require('stylus').middleware({ src: __dirname + '/public' })); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler({ dumpExceptions: true, showStakc: true })); 
}); 

app.configure('production', function() { 
    app.use(express.errorHandler()); 
}); 

var articleProvider= new ArticleProvider(); 


// Routes 
app.get('/', function(req, res) { 
    ArticleProvider.findAll(function(error, docs) { 
     res.send(docs); 
    }); 
}); 

app.listen(3000); 

文章提供商 - memory.js

var articleCounter = 1; 

ArticleProvider = function(){}; 
ArticleProvider.prototype.dummyData = []; 

ArticleProvider.prototype.findAll = function(callback) { 
    callback(null, this.dummyData) 
}; 

ArticleProvider.prototype.findById = function(id, callback) { 
    var result = null; 
    for(var i =0;i<this.dummyData.length;i++) { 
    if(this.dummyData[i]._id == id) { 
     result = this.dummyData[i]; 
     break; 
    } 
    } 
    callback(null, result); 
}; 

ArticleProvider.prototype.save = function(articles, callback) { 
    var article = null; 

    if(typeof(articles.length)=="undefined") 
    articles = [articles]; 

    for(var i =0;i< articles.length;i++) { 
    article = articles[i]; 
    article._id = articleCounter++; 
    article.created_at = new Date(); 

    if(article.comments === undefined) 
     article.comments = []; 

    for(var j =0;j< article.comments.length; j++) { 
     article.comments[j].created_at = new Date(); 
    } 
    this.dummyData[this.dummyData.length]= article; 
    } 
    callback(null, articles); 
}; 

/* Lets bootstrap with dummy data */ 
new ArticleProvider().save([ 
    {title: 'Post one', body: 'Body one', comments:[{author:'Bob', comment:'I love it'}, {author:'Dave', comment:'This is rubbish!'}]}, 
    {title: 'Post two', body: 'Body two'}, 
    {title: 'Post three', body: 'Body three'} 
], function(error, articles){}); 

exports.ArticleProvider = ArticleProvider; 

回答

4

這是你的資本在這裏app.js

// Routes 
app.get('/', function(req, res) { 
    ArticleProvider.findAll(function(error, docs) { 
     res.send(docs); 
    }); 
}); 

它應該是:

// Routes 
app.get('/', function(req, res) { 
    articleProvider.findAll(function(error, docs) { 
     res.send(docs); 
    }); 
});
+0

大ü救了我的頭髮! – Nyxynyx

+2

@Nyxynyx,捐贈一半的頭髮minitech。 – Chinook

相關問題