如何将模型和控制器合并到我的节点.js应用程序中

How Do I Incorporate Models and Controllers In My Node.js App?

本文关键字:节点 我的 js 应用程序 合并 模型 控制器      更新时间:2023-09-26

所以我正在尝试将数据库功能添加到我的简单网站中,这让我感到难以置信。我可以使用基本控制器,但是一旦合并模型,混乱就开始了。如果控制器在客户端运行,我该如何导入我的模型?我不能使用require,因为它是服务器端的。然而,无论我在网上看到哪里,他们都只是在控制器中使用require。在哪里存储模型和控制器,以及如何将它们正确合并到视图中?我假设的是模型和控制器必须以某种方式在服务器端使用,然后将信息传输到视图。如果它如此混乱,我一定在这里错过了一个大概念。我对所有这些部分如何相互作用的理解很糟糕,我觉得这是由我对这些东西的知识的巨大差距造成的。如果有人可以链接一个好的资源来更好地了解这些东西的基本原理,这样我就不会再犯这些愚蠢和令人沮丧的错误,我将不胜感激:)非常感谢你们和女孩

型:

var mongoose = require("mongoose");
var PostSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true
    },
    content: {
        type: String,
        required: true
    },
    imgUrl: {
        type: String,
        required: true
    },
    uploadDate: {
        type: Date,
        required: true
    },
    lastUpdated: {
        type: Date,
        required: true
    }
});
PostSchema.pre("save", function(next) {
    var currentDate = new Date();
    if(!this.uploadDate) {
        this.uploadDate = currentDate;
    }
    this.lastUpdated = currentDate;
    next();
});
var Post = mongoose.model("Post", PostSchema);
module.exports = Post;

视图:

头.翡翠:

//- CSS
link(href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet")
link(href="stylesheets/style.css" rel="stylesheet")
//- Scripts
script(src="bower_components/angular/angular.min.js")
script(src="bower_components/jquery/dist/jquery.min.js")
script(src="bower_components/bootstrap/dist/js/bootstrap.min.js")
script(src="app/app.js")
title #{title} | Vagablog

布局.翡翠:

doctype html
html(ng-app="app")
    head
        include head.jade
        block scripts
    body
        .container-fluid
            .row
                .col-xs-12
                    #logo-container
                        img(class="img-responsive" id="logo" src="../images/logo.png")
            include nav.jade
            block content
            block footer

索引.翡翠:

extends partials/layout
block scripts
    script(src="app/controllers/PostCtrl.js")
block content
    div(ng-controller="PostCtrl")
        .row
            .col-xs-9
                #main
                    .row
                        .col-xs-12
                            form(class="form-horizontal" ng-submit="post(title, content, image)")
                                .form-group
                                    label(for="inputTitle" class="col-sm-2 control-label") Title
                                    .col-sm-10
                                        input(required type="text" class="form-control" id="inputTitle" placeholder="Title" ng-model="title")
                                .form-group
                                    label(for="inputContent" class="col-sm-2 control-label") Content
                                    .col-sm-10
                                        textarea(required class="form-control" id="inputContent" placeholder="Content" ng-model="content")
                                .form-group
                                    label(for="inputImg" class="col-sm-2 control-label") Image URL
                                    .col-sm-10
                                        input(required type="text" class="form-control" id="inputImg" placeholder="Image URL" ng-model="image")
                                .form-group
                                    .col-sm-offset-2.col-sm-10
                                        button(type="submit" class="btn btn-default") Post
                    .row
                        .col-xs-12
                            div(ng-repeat="post in getPosts()")
                                hr
                                .well
                                    h2 {{ post.title }}
                                    h4 {{ post.content }}
                                    img(src="{{ post.imgUrl }}")
                                    p Uploaded: {{ post.uploadDate }}
                                    p Last Updated: {{ post.lastUpdated }}
            .col-xs-3
                .row
                    .col-xs-12
                        #sidebar
                            .well(style="height: 500px;")
block footer
    .row
        .col-xs-12
            hr
            .footer
                h4(class="copyright") Footer

控制器:

(function() {
    var Post = require("../models/post");
    var PostCtrl = function ($scope, $log, $location) {
        $scope.post = function (postTitle, postContent, postImage) {
            var newPost = Post({
                title: postTitle,
                content: postContent,
                imgUrl: postImage,
                uploadDate: new Date(),
            });
            newPost.save(function(err) {
                if (err) {
                    throw err;
                };
            });
        };
        $scope.getPosts = function() {
            Post.find({}, function(err, posts) {
                if (err) {
                    throw err;
                };
                return posts;
            });
        };
    };
    app.controller("PostCtrl", ["$scope", "$log", "$location", PostCtrl]);
})();

许多错误:

ReferenceError: require is not defined
 PostCtrl.js:3:6
"Error: [ng:areq] http://errors.angularjs.org/1.4.9/ng/areq?p0=PostCtrl&p1=not%20a%20function%2C%20got%20undefined
GET 
http://localhost:3000/%7B%7B%20post.imgUrl%20%7D%7D  [HTTP/1.1 500 Internal Server Error 4ms]

您遇到的问题是混合客户端和服务器代码。你要做的是创建一个 API,公开客户端应用可以访问的路由。这些路由将返回猫鼬查询。

本文应提供设置 API 服务器所需的一切

关于客户端代码,您需要创建具有 angular 的工厂,这些工厂具有针对每个相应端点的函数。在这些函数中,您可以利用 $http 服务从资源读取和更改数据。这可以像这样完成:

angular.module('myApp')
.factory('bearsFactory', ['$http', function($http) {
  var urlBase = 'localhost:9000/api/bears';
  return {
    getBears: function () {
      return $http.get(urlBase);
    },
    getBear: function (id) {
      return $http.get(urlBase + '/' + id);
    },
    createBear: function (bear) {
      return $http.post(urlBase, bear);
    },
    updateBear: function (bear) {
      return $http.put(urlBase + '/' + bear.ID, bear)
    },
    deleteBear: function (id) {
      return $http.delete(urlBase + '/' + id);
    }
  }
}]);

然后在控制器中,您可以像这样利用这些工厂:

angular.module('myApp')
.controller('bearController', ['$scope', 'bearsFactory', function ($scope, bearsFactory) {
  $scope.getBears() {
    bearsFactory.getBears()
    .success(function (bears) {
      $scope.bears = bears;
    })
    .error(function (error) {
      $scope.status = 'Unable to load bear data: ' + error.message;
    });
  }
}]);