2016-01-17 2 views
0

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

Я работаю над созданием простого форума с советами, сообщениями, а затем комментариями. Я основываю это на этом руководстве thinkster.io, https://thinkster.io/mean-stack-tutorial#opening-rest-routes.

Платы и сообщения у меня есть, но добавление комментариев - это еще одна история. Я попытался добавить новую схему комментариев и определить некоторые маршруты на стороне сервера, чтобы я мог получать и публиковать комментарии, но это не сработало. Теперь моя стратегия состоит в том, чтобы просто поместить комментарии в мою mongoose postSchema, а затем скрыть их и форму комментариев или ввести html с угловым, когда пользователь нажимает кнопку просмотра комментариев. Это не работает, хотя, поскольку моя отправка не обновляет представление или базу данных. В настоящее время я работаю.

app.js

(function() { 
angular.module('test', ['ui.router', 'ngMaterial']) 
.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state('home', { 
      url: '/home', 
      templateUrl: '/views/home/home.html', 
      controller: 'MainController', 
      resolve: { 
       boardPromise: ['boards', function (boards) { 
        return boards.getAll(); 
       }] 
      } 
     }) 

     .state('boards', { 
      url: '/boards/{id}', 
      templateUrl: '/views/posts/posts.html', 
      controller: 'PostsController', 
      resolve: { 
       board: ['$stateParams', 'boards', function ($stateParams, boards) { 
        return boards.get($stateParams.id); 
       }] 
      } 
     }); 



    $urlRouterProvider.otherwise('home'); 
}]); 
}()); 

Тогда мои контроллеры являются следующие:

Главный контроллер

(function() { 
angular.module('test') 
.controller('MainController', ['$scope', 'boards', function($scope, boards) { 
    $scope.boards = boards.boards; 

    $scope.addBoard = function() { 
     if ($scope.title === '') { 
      return; 
     } 
     boards.create({ 
      title: $scope.title, 
      description: $scope.description, 
     }); 

     $scope.title = ''; 
     $scope.description = ''; 
    }; 
}]); 
}()); 

сообщений Контроллер

(function() { 
'use strict'; 

angular.module('test') 
.controller('PostsController', ['$scope', 'boards', 'board', function ($scope,     boards, board) { 
    $scope.board = board; 

    $scope.addPost = function() { 
     if ($scope.body === '') { 
      return; 
     } 

     boards.addPost(board._id, { 
      body: $scope.body, 
      author: 'user', 
     }).success(function (post) { 
      $scope.board.posts.push(post); 
     }); 
     $scope.body = ''; 
    }; 

    $scope.addComment = function() { 
     if ($scope.commentts === '') { 
      return; 
     } 

     boards.addComment(board._id, { 
      comments: $scope.comments, 
      author: 'user', 
     }).success(function (comment) { 
      $scope.board.posts.comments.push(comment); 
     }) 
     $scope.comments = '' 
    }; 
}]); 
}()); 

служба обработки мой $ HTTP,

(function() { 
'use strict'; 

angular.module('test') 
.factory('boards', [ '$http', function($http) { 
    var o = { 
     boards: [] 
    }; 

    o.getAll = function() { 
     return $http.get('/boards').success(function (data) { 
      angular.copy(data, o.boards); 
     }); 
    }; 

    o.create = function(board) { 
     return $http.post('/boards', board).success(function (data) { 
      o.boards.push(data); 
     }); 
    }; 

    o.get = function(id) { 
     return $http.get('/boards/' + id).then(function (res) { 
      return res.data; 
     }); 
    }; 

    o.addPost = function (id, post) { 
     return $http.post('/boards/' + id + '/posts', post); 
    }; 

    o.addComment = function (id, comment) { 
     return $http.post('/boards/' + id + '/posts', comment); 
    }; 


    return o; 
}]); 
}()); 

Это соответствующая часть моего внутреннего интерфейса:

'use strict'; 

var mongoose = require('mongoose'), 
Board = mongoose.model('Board'), 
Post = mongoose.model('Post'); 

module.exports = function (app) { 

app.get('/boards', function (req, res, next) { 
    Board.find(function (err, boards) { 
     if (err) { 
      return next(err); 
     } 

     res.json(boards); 
    }); 
}); 

app.post('/boards', function (req, res, next) { 
    var board = new Board(req.body); 

    board.save(function (err, board) { 
     if (err) { 
      return next(err); 
     } 

     res.json(board); 
    }); 
}); 

app.param('board', function (req, res, next, id) { 
    var query = Board.findById(id); 

    query.exec(function (err, board) { 
     if (err) { 
      return next(err); 
     } 

     if (!board) { 
      return next(new Error('can\'t find the boards')); 
     } 

     req.board = board; 
     return next(); 
    }); 
}); 

app.param('post', function (req, res, next, id) { 
    var query = Post.findById(id); 

    query.exec = function (err, post) { 
     if (err) { 
      return next(err); 
     } 

     if (!post) { 
      return next(new Error('can\'t find the post')); 
     } 

     req.post = post; 
     return next(); 
    }; 
}); 

app.param('comment', function (req, res, next, id) { 
    var query = Comment.findById(id); 

    query.exec = function (err, comment) { 
     if (err){ 
      return next(err); 
     } 

     if (!comment) { 
      return next(new Error('can\'t find the comment')); 
     } 

     req.comment = comment; 
     return next(); 
    }; 
}); 

app.get('/boards/:board', function (req, res, next) { 
    req.board.populate('posts', 'comments', function (err, board) { 
     if (err) { 
      return next(err); 
     } 
     res.json(board); 
    }); 
}); 

app.post('/boards/:board/posts', function (req, res, next) { 
    var post = new Post(req.body); 
    post.board = req.board; 

    post.save(function (err, post) { 
     if (err) { 
      return next(err); 
     } 

     req.board.posts.push(post); 
     req.board.save(function (err, board) { 
      if (err) { 
       return next(err); 
      } 

      res.json(post); 
     }); 
    }); 
}); 

}; 

И соответствующие схемы:

Board схема:

'use strict'; 

var mongoose = require('mongoose'), 
Schema = mongoose.Schema; 

var boardSchema = new Schema({ 
    title: String, 
    description: String, 
    posts: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Post' 
    }] 
}); 

mongoose.model('Board', boardSchema); 

и Post Схема:

'use strict'; 

var mongoose = require('mongoose'), 
Schema = mongoose.Schema; 

var postSchema = new Schema({ 
    body: String, 
    author: String, 
    comments: { 
    type: String, 
    }, 
    board: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Board' 
    }, 
}); 

mongoose.model('Post', postSchema); 

Любая помощь приветствуется. Я довольно новичок в использовании углового и стека MEAN в целом, но я действительно стараюсь стать лучше. Любая информация, которую вы, ребята, можете мне дать, наверняка улучшит мое понимание. Спасибо огромное! :)

ответ

0

Поле comments вашей схемы Post определяется как одна строка. Это означает, что каждый новый комментарий перезаписывает предыдущий. Он должен быть определен как массив строк вместо:

Post схемы

var postSchema = new Schema({ 
    body: String, 
    author: String, 
    comments: [{ 
    type: String, 
    }], 
    board: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Board' 
    }, 
}); 

mongoose.model('Post', postSchema);