Kuba
Kuba

Reputation: 433

TypeError: Article is not a function, POST 500 (Internal Server Error)

I want to ask you for help in this code. Edit and delete works well but I can't add an article to the database (mongodb) .

*errors in browser console:

POST http://localhost:5000/articles 500 (Internal Server Error)

Article is not a function

TypeError: Article is not a function in articles.js

I don´t know what is wrong with object (Article) . Example is of course: Projects in AngularJS - Learn by building 10 Project - Section 7: KnowledgeBase. Please help me to solve this code. I would like to understand why it didn't work.

Form html

<div ng-controller="ArticlesCreateCtrl">
<h3>Nowy</h3>
<form ng-submit="addArticle()">
  <div class="form-group">
    <label>Title</label>
    <input type="text" class="form-control" ng-model="title" name="title">
    <label>Category</label>
    <select  class="form-control" ng-model="category" name="category">
        <option ng-repeat="category in categories" value={{category.name}}">
        {{category.name}}</option>
    </select>
    <label>Body text</label>
    <textarea class="form-control" ng-model="body" name="body"></textarea>
  </div>
    <button type="submit" class="btn btn-default">Submit</button>
    <a href="#/categories"  class="btn btn-default">Canel</a>
</form>
</div>

ArticlesCreateCtrl controller

.controller('ArticlesCreateCtrl', ['$scope', '$http', '$routeParams', '$location',
 function($scope, $http, $routeParams, $location) {
    $http.get('/categories').success(function(data){
        $scope.categories = data;
    });

    $scope.addArticle = function(){
        var data = {
            title: $scope.title,
            body: $scope.body,
            category: $scope.category
        };

        $http.post('/articles', data).success(function(data, status){
            console.log(status);
        });
        $location.path('/articles');
    }
}])

articles.js // Error here

var express = require('express');
var router = express.Router();
var Article = require('../models/article');

router.post('/', function(req, res, next) {
     var title = req.body.title;
     var category = req.body.category;
     var body = req.body.body;

     ###error in this line ###
     var newArticle = new Article({
         title: title,
         category: category,
         body: body
     });

     Article.createArticle(newArticle, function(err, article) {
         if(err) {
         console.log(err);
         }
            res.location('/articles');
            res.redirect('/articles');
     });
});

module.exports = router;

article.js

var mongoose = require('mongoose');

var artSchema = mongoose.Schema({
    title: {
    type: String,
    index: true,
    required: true
    },
    body: {
    type: String,
    required: true
    },
    category:{
    type: String,
    index: true,
    required: true
    },
    date:{
    type:Date,
    default: Date.now
    }
});

var Article =  module.exprots =  mongoose.model('Article', artSchema);

module.exports.createArticle = function(newArticle, callback){
newArticle.save(callback);
};

console.log(Article)

before var Article = require('../models/article');

      undefined 

and after var Article = require('../models/article')

    { getArticles: [Function],
      getArticleById: [Function],
      getArticlesByCategory: [Function],
      createArticle: [Function],
      updateArticle: [Function],
      removeArticle: [Function] }

Upvotes: 2

Views: 1109

Answers (1)

Kuba
Kuba

Reputation: 433

OK Friends - works

I don't know if it's the best way, but only I changed this line:

    var Article =  module.exprots =  mongoose.model('Article', artSchema);

on

    var Article;
    module.exports =  Article =  mongoose.model('Article', artSchema);

This solved my problem and hope this will help you in future.

Upvotes: 0

Related Questions