1

I just started getting into node.js and followed this great tutorial on node.js at Howtonode, express and mongod. However, I seem to be getting an error that no one else commented on in the comments. The latest comment was about a month ago, so maybe the code is outdated?

The problem is that when I visit http://localhost:3000/, the page shows Internal Server Error and in the terminal, I get the error message below. Does anyone know what happened?

Here's the error message:

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);

article-provider-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;
0

1 Answer 1

4

It's your capitalization of ArticleProvider here in app.js:

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

It should be:

// Routes
app.get('/', function(req, res) {
    articleProvider.findAll(function(error, docs) {
        res.send(docs);
    });
});
Sign up to request clarification or add additional context in comments.

1 Comment

@Nyxynyx , Donate half of that hair to minitech.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.