2016-07-27 76 views
0

我正在關注angular 2 Tutorial of Heroes指南,並試圖從mongoDb中獲取並顯示一個英雄詳細信息部分(如教程中所示)。我能夠在mongo中找到我的用戶(英雄)運行節點後端,但在訪問該節時卻不是單個英雄。 我對typeScript完全陌生,所以請隨身攜帶。獲取Angular 2的單個文檔

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

The /detail/ part of that URL is constant. The trailing numeric id part changes from hero to hero. We need to represent that variable part of the route with a parameter (or token) that stands for the hero's id.

,而且我的ObjectId得到的MongoDB不與此合作很好。如果我將number參數改爲字符串,並將id解析爲字符串,它也不起作用,我也沒有料到它或者因爲我現在不知道我在做什麼!

getHero(_id: String) 

反正...當我跑我的打字稿編譯我得到這個錯誤:

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

我真的不明白這是如何工作的角2 /打字稿,遺憾的是不知道要麼就我的問題要求什麼。

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從客戶的角度?任何可能使我指向正確方向的東西。

謝謝!

回答

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); 
    }); 
}) 
+0

這似乎是合理的,但遺憾的是它並沒有爲我做的伎倆。 –

+0

好的,我剛剛讀了你的教程,這是在內存數據庫中,所以你似乎沒有處理一個真正的web API。但是,由於您使用本地主機url,我想您已經完成了節點REST API。你能告訴我們你的節點API的代碼嗎?我認爲它錯過了一些東西。 – Odonno

+0

是的,這是正確的。正如我所說,我能夠讓所有用戶從我的REST API返回,但不能爲單個用戶返回。我將確保添加服務器片段。 –