Angularjs 用平均堆栈构建几个简单的测试项目论坛

Angularjs 用平均堆栈构建几个简单的测试项目论坛,angularjs,node.js,mongodb,mean,forum,Angularjs,Node.js,Mongodb,Mean,Forum,目前,我在让我当前的项目正常工作方面遇到了一些困难。。。我知道在结构方面我没有遵循一些最佳实践,但这仅仅是一个功能测试,直到我可以让它工作,然后我将正确地构建它 我正在构建一个简单的论坛,包括论坛、帖子和评论。我基于thinkster.io教程 我的留言板和帖子都在运行,但添加评论则是另一回事。我尝试添加一个新的注释模式,并定义一些服务器端路由,以允许我获取和发布注释,但没有成功。现在,我的策略是将注释放在我的mongoose postSchema中,然后隐藏它们和注释表单,或者在用户单击vie

目前,我在让我当前的项目正常工作方面遇到了一些困难。。。我知道在结构方面我没有遵循一些最佳实践,但这仅仅是一个功能测试,直到我可以让它工作,然后我将正确地构建它

我正在构建一个简单的论坛,包括论坛、帖子和评论。我基于thinkster.io教程

我的留言板和帖子都在运行,但添加评论则是另一回事。我尝试添加一个新的注释模式,并定义一些服务器端路由,以允许我获取和发布注释,但没有成功。现在,我的策略是将注释放在我的mongoose postSchema中,然后隐藏它们和注释表单,或者在用户单击view comments按钮时使用angular注入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 = ''
    };
}]);
}());
邮务主任

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

};
以及相应的模式:

模式:

'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);
'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);
以及
Post
模式:

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

感谢您的帮助。一般来说,我对使用angular和MEAN堆栈相当陌生,但我真的希望做得更好。你们能给我的任何信息肯定会提高我的理解力。非常感谢!:)

您的
Post
架构的
comments
字段被定义为单个字符串。这意味着每个新注释都会覆盖上一条注释。应将其定义为字符串数组:

Post
schema

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

mongoose.model('Post', postSchema);