【问题标题】:extract content from Object, Nodejs从 Object、Nodejs 中提取内容
【发布时间】:2016-06-01 08:38:05
【问题描述】:

我正在使用 MEAN 堆栈并尝试从对象中提取信息,但属性会根据许多因素而变化,因此无法调用它们。有没有办法我可以通过另一种方式获取信息?这些数据将用于更新我的 monogdb 中的不同内容。

关于我的数据库的简单信息:3 个集合。用户、年份、课程。

年份:id、userid、课程 {courseid、grade、}

课程:id、姓名、学分等

我已经设法将信息发送到 nodejs 文件,但不能用它做任何事情。下面是我做的控制台日志的结果信息。如何从对象中获取信息以便更新数据库?

日志结果

Object {year: Object, grade: Object}
    grade:Object
          574d8ce6bfb4ea470a2e10c7:"3"
          __proto__:Object
    year:Object
         574e8cf5ae8fc00917ded99b:true
         __proto__:Object

  Grade contains the id of the course for which I want to change the grade and the grade 
  I want to change to. 
  Year contains the Id of the year in which the course is stored. 

home/index.html

下面只包含表格。变量 year.XXX 迭代一年(从数据库中检索)。

year.course = {id:XX,年级:YY}

theCourse 遍历数据库中的所有课程以获取特定于课程的信息。

vm.change 是发送到控制器的变量。

 <form>
     <div class="panel-heading " ><b>  YEAR {{year.year}}</b>
         <label style="float: right;"> Edit
             <input type="checkbox" id="year._id" value="year.id" ng-model="vm.change.year[year._id]"/>
                </label>
                <div><p>Sum of Credits: {{year.totalCredits}}</p></div>
            </div>
            <div class="panel-body hideyear" >
                <div class="col-xs-12">
                    <h4>HT</h4>
                    <table class="table " >
                        <tr class="active" >
                            <th><b>Course code</b></th>
                            <th><b>Grade</b></th>
                            <th><b>Update Grade</b></th>
                        </tr>
                        <tbody ng-repeat= "course in year.courses">
                        <tr ng-repeat="theCourse in vm.courses" ng-if="theCourse._id==course.id && (theCourse.term=='HT1'||theCourse.term=='HT2')">
                            <td >{{theCourse.courseCode}}</td>
                            <td>{{course.grade}}</td>
                            <td ><select ng-disabled="!vm.change.year[year._id]" ng-model="vm.change.grade[course.id]">
                                <option disabled selected value> -- update grade -- </option>
                                <option value="NA">NA</option>
                                <option value="5">5</option>
                                <option value="4">4</option>
                                <option value="3">3</option>
                                <option value="G">G</option>
                                <option value="U">U</option>
                            </select></td>
                        </tr>
                        </tbody>
                    </table>
                </div>
                </div>
                <button type="submit"  class="btn btn-primary" ng-disabled="!vm.change.year[year._id]" ng-click="vm.saveChange(vm.change)">Save</button>
            </div>
            </form>

index.controller.js

 function saveChange(change){
        console.log(change)
}

编辑

在一个名为 app.js 的文件中将 vm 设置为 Controller as 并选择要使用的控制器:

(function () {
    'use strict';

    angular
        .module('app', ['ui.router'])
        .config(config)
        .run(run);

    /*
    Connects the right subpage with corresponding controller and url.
    */

    function config($stateProvider, $urlRouterProvider) {
        // default route
        $urlRouterProvider.otherwise("/");

        $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'home/index.html',
            controller: 'Home.IndexController',
            controllerAs: 'vm',
            data: { activeTab: 'home' }
        });
    }

当 html 加载时,控制器从页面大部分部分使用的数据库中收集一些信息。

function initController() {
        // get current user
        UserService.GetCurrent().then(function (user) {
            vm.user = user;

        });
        //Gets all years in the database
        YearService.GetAll().then(function (years) {
            vm.years = years;
        });
        // Gets all courses in the databased.
        CourseService.GetAll().then(function (courses) {
            vm.courses = courses;
        });
    }

上面的 initcontroller 中的所有 get 几乎都做同样的事情,所以我将展示其中一个的过程,YearSevice.GetAll,调用 app-service/year.service.js

(function () {
'use strict';

    angular
        .module('app')
        .factory('YearService', Service);

    function Service($http, $q){
        var service =  {};
        service.GetAll = GetAll;
        return service;

        function GetAll() {
        return $http.get('/api/year/getAll').then(handleSuccess, handleError);
        }

使用 $http.get 我们通过服务器到达服务器端控制器,year.controller

var config = require('config.json');
var express = require('express');
var router = express.Router();
var YearService = require('services/year.service');

// routes

router.get('/getAll', getAll);

function getAll(req,res){
    YearService.getAll()
         .then(function(result){
            if(result){
                res.send(result);
            }else{
                res.sendStatus(404);
            }
        })
         .catch(function(err){
            res.status(400).send(err);
         });
}

YearService.getAll 调用服务端服务:services/year.services.js

var config = require('config.json');
var _ = require('lodash');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });


db.bind('years');
db.bind('users');
db.bind('courses');

var service = {};
service.getAll = getAll;
module.exports = service;


function getAll(){
    var deferred = Q.defer();

    //
    db.collection('years').find().toArray(function(err, result) {
        if (err) deferred.reject(err);
        deferred.resolve(result);
        return deferred.promise;
    });
    return deferred.promise;

}

并且该集合一直返回到 html 代码。将新信息发送到数据库具有相同的结构,但包括一个要始终发送的对象。在以前的情况下,该对象很容易构建,但现在我需要发送课程代码、年份 ID 和等级,并尝试使用复选框和选择来完成,所以三个值但在两个“载体”中。

【问题讨论】:

    标签: angularjs node.js mongodb object mean


    【解决方案1】:

    要访问存储在您所指的对象中的数据,您可以像这样访问它:

    grade.id
    

    或者像这样

    grade['id']
    

    如果你不确定一个对象是否包含任何给定的属性,你可以这样检查:

    grade.hasOwnProperty('id')
    

    如果你只是想记录来控制台对象的内容,你可以这样做:

    console.log( JSON.stringify( grade ) );
    

    希望这能回答你的问题

    【讨论】:

    • 这很遗憾行不通。 Grade 确实获得了一个属性 id,它获得了一个与我要更改等级的课程的 id 名称相同的属性。所以无法使用 id 访问它,因为它会根据我想要更改等级的课程而改变。仅控制台记录它,因为我想查看内容 atm,以便弄清楚如何继续。 @Stian
    • 那我不确定我是否理解你的问题到底是什么?似乎只是想使用存储在 Object 中的一些信息?
    • 我确实想使用对象中的信息,但是如果您查看开头的控制台日志,您会发现信息以我无法使用的方式存储,即等级。 id 来获取它,因为属性是grade.574d8ce6bfb4ea470a2e10c7,其中数字对应于我想在数据库中更改的课程的 ID。所以我想从等级对象中提取 574d8ce6bfb4ea470a2e10c7 和 3 。 @Stian
    • 啊,现在我明白了。您还有更多代码要查看吗?例如,您将数据从 html 发送到 nodejs 服务器的位置?以及您如何在服务器上接收它?
    • 添加了更多代码和解释,这样是否更清楚? @Stian
    【解决方案2】:

    为什么要以如此复杂的方式进行操作 - ctrl.save(ctrl.courses) 包含所有需要保存的信息。

    angular.module('app', [])
      .factory('grades', function() {
        var grades = {}
        grades.courses = [{
          code: 'abc',
          grade: 1
        }, {
          code: 'bca',
          grade: 5
        }, {
          code: 'cab',
          grade: 3
        }]
        grades.available = [1, 2, 3, 4, 5]
        return grades
      })
      .controller('firstCtrl', function(grades) {
        this.availableGrades = grades.available
        this.courses = angular.copy(grades.courses)
        this.save = function(courses) {
          grades.courses = angular.copy(courses)
    
          // as we have all needed data in controller
          // we can also do it like that
          //
          // grades.courses = angular.copy(this.courses)
        }
      })
      .controller('secondCtrl', function($scope, grades) {
        this.availableGrades = grades.available
        this.courses = grades.courses
    
        $scope.$watch(function() {
          return grades.courses
        }, function(courses) {
          this.courses = courses
        }.bind(this))
      })
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <div ng-app='app'>
      <div ng-controller='firstCtrl as ctrl'>
        <ul>
          <li ng-repeat='course in ctrl.courses'>
            {{ course.code }} -
            <select ng-model='course.grade' ng-options='grade for grade in ctrl.availableGrades'></select>
          </li>
        </ul>
        <button ng-click=ctrl.save(ctrl.courses)>Save</button>
      </div>
      <div ng-controller='secondCtrl as ctrl'>
        <ul>
          <li ng-repeat='course in ctrl.courses'>
            {{ course.code }} -
            <select ng-model='course.grade' ng-options='grade for grade in ctrl.availableGrades'></select>
          </li>
        </ul>
      </div>
    </div>

    【讨论】:

    • 不能这样实现,因为数据库有点复杂。也许我没有在问题中正确解释它。该数据库代表大学的课程计划系统。所以有用户,每个用户都有不同的年份放置课程。因此课程是大学提供的所有课程,因此不能有成绩属性,因为成绩对每个学生都是个人的。
    猜你喜欢
    • 2020-03-19
    • 2011-05-25
    • 2017-06-14
    • 2012-01-28
    • 2021-08-22
    • 2018-06-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多