用mean stack构建一些简单的测试项目论坛

问题描述 投票:0回答:1

我目前在让我当前的项目运行时遇到了一些麻烦...我知道在结构方面我没有遵循一些最佳实践,但这只是为了功能测试,直到我可以让它工作,然后我会正确地构建它。

我正在构建一个简单的论坛,其中包含论坛、帖子和评论。我的基础是这个 thinkster.io 教程,https://thinkster.io/mean-stack-tutorial#opening-rest-routes

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

处理我的 $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);

如有任何帮助,我们将不胜感激。一般来说,我对使用 Angular 和 MEAN 堆栈相当陌生,但我真的希望变得更好。你们能给我的任何信息肯定会提高我的理解。太感谢了! :)

angularjs node.js mongodb mean forum
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.