【问题标题】:MEAN stack application not retrieving data from MongoDB [duplicate]MEAN堆栈应用程序未从MongoDB检索数据[重复]
【发布时间】:2019-07-28 18:32:52
【问题描述】:

我对 MEAN 堆栈应用程序的工作相当陌生,并且正在研究一个预先存在的 MEAN 堆栈应用程序,该应用程序用于在从 mongoDB 数据库中提取信息并以表格形式发布后在页面上显示一些信息。信息仍然存在于数据库中,但在某处,代码停止在页面上显示数据。现在,我的 npm 日志中出现以下错误:“CastError: Cast to ObjectId failed for value "" at path "_id"。我很难弄清楚出了什么问题。我什至尝试将 ngResources 包含为下面的 serviceA.js 代码中的一个依赖项,但没有任何区别。

为了澄清,这个问题试图确定为什么一段特定的代码不起作用。上一个具有类似错误的问题讨论了如何将字符串转换为 objectID。这不是这里的问题。我正在努力解决的是如何完全从 MongoDB 中获取相关数据。似乎没有执行正确的查询,我正在尝试找出原因。

感谢一些帮助。这是我的代码:

Html 代码(来自文件 codeA.html):

<tr ng-repeat="x in allX | offset: offsetValue | limitTo: itemsPerPage track by x._id">

对应的控制器代码(来自aController.js):

aController.controller('aCtrl', ['$scope','$http', '$state', 'serviceA', function($scope, $http, $state, serviceA, $rootScope) {

  if ($state.current.name == 'codeA') {
    $scope.reqLoadingHash = {};
    var docs = ['doc_a', 'doc_b', 'doc_c'];
    serviceA.get({}, function (response) {
      $scope.allX = response.searchResult;
      angular.forEach($scope.allX, function(val, key) {
        var numDocs = 0;
        docs.forEach(function(prop) {
          if (val[prop]) {
            numDocs++;
          }
        });
        $scope.allX[key].numDocs = numDocs;
      });
      $scope.range();
    });
  }
}])

服务代码:

(function() {
  'use strict';

  angular.module('routerApp')
    .factory('serviceA', serviceA);

  serviceA.$inject = ['$resource'];

  function serviceA($resource) {
    return $resource('/api/requestA/:ownerRequestId', {}, {
      getRequest: {
        method: 'GET',
        url: '/api/requestA/user/:userId/listing/:listingId'
      },
      update: {
        method: 'PUT'
      },
      delete: {
          method: 'DELETE'
      }
    });
  }
})();

路由器代码:

var Router = require("express").Router;
module.exports = function () {
  var router = new Router();
  router.route('/requestA/:ownerRequestId').get(function(req, res, next) {
        ownerRequest.findById(req.params.ownerRequestId)
            .populate('listing owner')
            .exec(function(err, ownerRequest) {
                if (err) {
                    return next(err);
                }

                res.json({searchResult: ownerRequest});
            });
    });
  return router;
}

【问题讨论】:

  • “链接副本”是您报告的错误和问题的“完全匹配”。您正在以req.params.ownerRequestId 提交数据,这不是有效的 ObjectId 格式,这就是您收到确切消息的原因。了解这一点并确保您发送有效格式,或相应地更改您的猫鼬模式,因此 _id 不是默认的 ObjectId 类型。您自己的文字:Now, I get the following error in my npm log: "CastError: Cast to ObjectId failed for value "" at path "_id".

标签: node.js angularjs mongodb express mongoose


【解决方案1】:

错误消息'CastError: Cast to ObjectId failed for value "" at path "_id' 来自您的 mongoDB 函数 findById()。此函数需要 ObjectId 作为第一个参数,但在您的情况下,它只是空字符串,所以它会引发错误。

在您的角度控制器中,当您调用 serviceA.get() 时,您不会将 ownerRequestId 作为参数传递。

【讨论】:

  • 我迷路了。我想要做的是让控制器使用 serviceA 从 MongoDB 集合“ownerRequest”中检索所有文档,并检索与网页上的这些文档有关的信息(通过 html 代码中的“ng-repeat = x in allX”。 ) 为此,您将如何修改代码?
  • @user6860460 如果要检索所有文档,则应使用find() 而不是findById()。您可能希望拥有另一个名为 /ownerRequests 的 API 端点,在服务器控制器内部,您拥有 ownerRequest.find() 并将结果传递给客户端。
  • 没有解决问题。代码还有其他问题阻止了服务被完全调用。我在serviceA代码中放置了一些console.log语句(在“function serviceA($resource){”之后,它们甚至没有出现在浏览器控制台中。
  • 检查控制器和服务是否在同一个模块下,是否正确加载浏览器。
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2017-07-26
  • 2014-03-09
  • 2019-04-15
  • 1970-01-01
  • 2015-09-03
  • 2017-08-07
相关资源
最近更新 更多