Tengo una colección de publicaciones y cada publicación tiene un id y un userId .

Quiero encontrar todas las publicaciones de un usuario específico (usando la propiedad userId).

Aquí está mi servicio angular2:

    export class PostsService {

    private _url = '/api/posts';

    constructor(private _http: Http) { }

    getPosts(): Observable<Post[]> {
        return this._http.get(this._url).map(res => res.json());
    }
    getUserPosts(userId: number) {
        return this._http.get(this._url + '/' + userId).map(posts => posts.json());
    }
}

Y mi código nodejs:

router.get('/posts', function(req, res) {
    post.find({}).exec(function(err, posts) {
        if (err) {
            console.log("ERROR FETCHING POSTS!!");
        } else {
            res.json(posts);
        }
    });
});


router.get('/posts/:id', function(req, res) {
    post.findById(req.params.id).exec(function(err, posts) {
        if (err) {
            console.log("ERROR FETCHING POSTS!!" + err);
        } else {
            res.json(posts);
        }
    });
});
0
user5725581 22 oct. 2017 a las 23:58

2 respuestas

La mejor respuesta

Necesitas enviar query params al backend para poder filtrarlos en tus controladores nodejs.En tu Angular Service tendrás algo como esto:

export class PostsService {

    private _url = '/api/posts';

    constructor(private _http: Http) { }

    getPosts(): Observable<Post[]> {
        return this._http.get(this._url).map(res => res.json());
    }
 getUsersPost():Observable<Post[]>{
    let params - new HttpParams();
    params = params.append('user_id', userIdValue );
    return this._http.get(this._url, { params: params }). subscribe(....more code)
}
    getUserPosts(userId: number) {
        return this._http.get(this._url + '/' + userId).map(posts => posts.json());
    }
}

La URL final sería algo como esto: /api/posts?user_id=userIdValue. Necesitas importar HttpParams desde '@angular/common/http' Supongo que tienes Angular> 4.3, para obtener más información sobre HttpParams, consulta para Documento oficial de Angular

Ahora, solo tienes que filtrar tu publicación en tu controlador nodejs:

router.get('/posts', function(req, res) {
let query = {};
if(typeof req.query.user_id != 'undefined'){
    query['createdBy'] = req.query.user_id // supposing that 'createdBy' is where you store the user id's in post scheme 
}
    post.find(query).exec(function(err, posts) {
        if (err) {
            console.log("ERROR FETCHING POSTS!!");
        } else {
            res.json(posts);
        }
    });
});

Si no se proporciona el parámetro de consulta user_id, la función post.find devolverá todas las publicaciones, si se proporciona, devolverá todas las publicaciones creadas por ese usuario. Espero que esto ayude.

0
Fabio Carballo 24 oct. 2017 a las 05:03

Complete este tutorial antes de saltar al código.

https://angular-2-training-book.rangle.io/handout/http/
0
RED.Skull 26 oct. 2017 a las 03:39