0

JSON データを AngularJS アプリケーションに送信する API の作成に成功しました。バックエンドは Mongodb からデータを読み取ります (Mongoose パッケージを使用)。インデックスメソッドは魅力のように機能します(テスト環境は1つのサーバーであり、バックエンドとフロントエンドが異なるポートで実行されているため、jsonpを使用しています)

exports.index = function (req, res){
    return ContactModel.find(function (err, contacts) {
        if (!err) {
            return res.jsonp(contacts);
        } else {
                return console.log(err);
        }
    });
}

AngularJS の部分は次のようになります。

$http({method: 'jsonp', url: 'http://host:1222/contacts?callback=JSON_CALLBACK'}).success(function(data, status, headers, config) {
    $scope.contacts = data;
});

そして後で、このデータに喜んでアクセスできます (例: {{ contact.name }} )

問題は、findByIdを使用して 1 つの結果のみを表示しようとすると、次のようになることです。

exports.findById = function (req, res) {
    return ContactModel.findById(req.params.id, function (err, contact) {
      if (!err) {
            return res.jsonp(contact);
      } else {
        return console.log(err);
      }
    });
}

私の AngularJS ViewController は次のようになります。

function ViewController($scope, $http) {
    $http({method: 'jsonp', url: 'http://host:1222/contacts/:id?callback=JSON_CALLBACK'}).success(function(data, status, headers, config) {
      console.log("Data: " +data);
      $scope.contact = data;
    });
}

そして、それは次のように呼び出されます:

<a href="#/contacts/{{ contact._id }}">{{ contact.name }}</a>

ただし、私が受け取り続けるエラーは次のとおりです。

{ message: 'Cast to ObjectId failed for value ":id" at path "_id"',
  name: 'CastError',
  type: 'ObjectId',
  value: ':id',
  path: '_id' }

データベースからのサンプルは次のとおりです。

JSON_CALLBACK && JSON_CALLBACK([
  {
    "name": "Test User",
    "_id": "51c5fde3ce36618e0c000003",
    "__v": 0
  }
]);

「パス "_id" の値 ":id" で ObjectId へのキャストに失敗しました」という問題に関する記事をかなり読んだことがありますが、理解できません...ルックアップ用に独自の ID を作成する必要がありますか? その場合、MongoDB には推奨されない auto_increment の一意の ID スキーマを導入する必要があります。したがって、正しい方法でデータをクエリできるようにするために何をしなければならないか教えていただけますか? また、AngularJS に関して私の現在の実装に問題がある場合は、お知らせください (このトピックは初めてです)。

アップデート

これは、AngularJS でルーティングを行う方法です。

  angular.module('contactmanager', ['filters']).
        config(function($routeProvider) {
          $routeProvider.
            when('/', {controller:ListController, templateUrl:'list.html'}).
            when('/contacts/:id', {controller:ViewController, templateUrl:'contact.html'}).
            otherwise({redirectTo:'/'});
        });

更新 2

サーバー側のルーティング -- エクスプレス:

var express = require("express");
var contacts = require("./contact");
var app = express();

app.get("/", contacts.index);
app.get('/contacts', contacts.index);
app.get('/contacts/:id', contacts.findById);
app.listen(1222);

私はここに何かが欠けていると思います....?

4

1 に答える 1