使用Angular 2获取单个文档

时间:2016-07-27 11:30:39

标签: mongodb typescript angular

我正在关注angular 2 Tutorial of Heroes指南并尝试从mongoDb获取并显示单个Hero,当我转到英雄详细信息部分时(如教程中所示)。我能够在运行节点后端的mongo中找到我的用户(英雄),但在访问该部分时却找不到单个英雄。

hero.service.ts

//The part that gives me errors.
private heroesUrl = 'http://localhost:8080/admin/users';

constructor(private http: Http) { }

  //Works
  getHeroes() {
    return this.http.get(this.heroesUrl)
      .toPromise()
      .then(response => response.json() as Hero[])
      .catch(this.handleError);
  }

  //Doesn't work      
  getHero(_id: number) {
    return this.getHeroes()
      //How should I work with the _id?
      .then(heroes => heroes.find(hero => hero._id === _id));
  }
  //:note that this worked properly when I had the documents in memory with a mock api. Where the ids initially where numbers. 

在我看来,id必须是数字:

https://angular.io/docs/ts/latest/tutorial/toh-pt5.html

  

该网址的/ detail /部分是常量。尾随数字id部分从英雄变为英雄。我们需要用一个代表英雄身份的参数(或代币)来表示路线的可变部分。

并且我从mongoDb获得的ObjectId与此一起使用效果不佳。如果我将number参数更改为字符串,并将id解析为字符串,它也不起作用,我也没想到它,因为我不知道我现在正在做什么!

getHero(_id: String)

无论如何...当我运行我的typeScript编译器时,我收到此错误:

app/+heroes/hero.service.ts(24,65): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.

我真的不明白这是如何工作在角2 / typeScript,抱歉,不知道究竟要求我的问题。

app.routes.ts

const routes: RouterConfig = [
  {
    path: '',
    component: DashboardComponent
  },
  {
    path: 'detail/:id',
    component: HeroDetailComponent
  },
  {
    path: 'heroes',
    component: HeroesComponent
  }
];

我的应用会识别该ID并将我发送到正确的路径:http://localhost:8080/detail/5773fbc1383ec4868619f1fa 但是在页面上没有找到数据。

Failed to load resource: the server responded with a status of 404 (Not Found)

在我的仪表板中,这就是我如何导航到英雄自己的路线。

export class DashboardComponent implements OnInit {

  heroes: Hero [] = [];

  constructor(
    private router: Router,
    private heroService: HeroService) {
  }

  ngOnInit() {
    this.heroService.getHeroes()
      .then(heroes => this.heroes = heroes);
  }

  gotoDetail(hero: Hero) {
    let link = ['/detail', hero._id];
    this.router.navigate(link);
  }
}

示例教程中的所有内容都要求返回数据的id为数字。如果我将数字值更改为字符串而不是..

//hero.ts
    export class Hero {
     _id: number;
     name: string;
    }

以及发生这种情况的所有其他地方我得到了一堆错误,我无法显示每个地方,这将导致很多示例代码。

节点中的我的REST API: (当使用邮递员时,这可以正常工作)

//server/routes/admin.js

var express = require('express');
var app = express();
var router = express.Router();
var passport = require('passport');
var User = require('../models/user');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');


router.get('/users', /*isAdmin,*/ function(req, res) {
    User.find(function(err, users){
      if (err)
        return res.send(err);
      res.json(users);
    });
  });
  //CRUD operations for a single Company by its id
  router.route('/users/:id')
    .get(/*isAdmin, */function(req, res){
      User.findById(req.params.id, function(err, user){
        if (err)
          res.send(err);
        res.json(user);
      });
    })

如何从mongoDb中找到一个单独的文档,其中_id是来自客户端的角度?任何能指引我正确方向的东西。

1 个答案:

答案 0 :(得分:0)

我想有一个特定的HTTP路由可以检索单个英雄/文档。以下是在客户端应该如何完成的事情:

getHero(_id: number) {
    return this.http.get(this.heroesUrl + '/' + _id)
         .toPromise()
         .then(response => response.json() as Hero)
         .catch(this.handleError);
}

我想你应该有一条路线:

router.get('/users/:id', /*isAdmin, */function(req, res){
  User.findById(req.params.id, function(err, user){
    if (err)
      res.send(err);
    res.json(user);
  });
})