我正在关注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是来自客户端的角度?任何能指引我正确方向的东西。
答案 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);
});
})