使用ids数组表单数据库获取所有匹配项

时间:2017-01-11 12:26:36

标签: mongodb http angular express typescript

我无法接收与我的ids数组匹配的项目列表。

这是Angular组件中的代码的一部分:

this.orderService.getSpecyficOrders(ids)
    .subscribe(orders => { ... 

其中id是

的数组
[{_id : ID },{_id : ID },{_id : ID },]

ID是"5235sd23424asd234223sf44"种类型的MongoDB文档字符串。

在我已导入的角度服务文件中: Http,Headers和import'rxjs / add / operator / map';

以下是Angular中的服务代码:

getSpecyficOrders(ids){
    return this.http.get('/api/ordersspecyfic', ids)
        .map(res => res.json());
}

在快递文件中我需要:multer,express,router,mongojs,db

以下是express中代码的一部分,调用mongodb:

router.get('/ordersspecyfic', function(req, res, next){
    var ids = req.body;
    ids = ids.map(function (obj){ return mongojs.ObjectId(obj._id)});
    db.orders.find({_id: {$in: ids}}, function(err, orders){
        if(err){
            res.send(err);
        }
        res.json(orders);
    });
});

我收到错误:

  

未捕获的响应{_body:“TypeError:ids.map不是函数
  & n ... / node_modules / express / lib / router / index.js:46:12)↵“,状态:   500,ok:false,statusText:“内部服务器错误”,标题:   集管...}

快递文件中的Console.log 告诉我req.body是一个空对象{}

据我所知req.body不是数组,但我不知道这是否只是该代码的问题。

所有其他要求获取单个元素,获取所有项目等都正常工作。 我只是不能让这个工作..

2 个答案:

答案 0 :(得分:2)

我假设您尝试使用

ids发送到服务器端
return this.http.get('/api/ordersspecyfic', ids)

http.get api并不像那样

  

get(url:string,options?:RequestOptionsArgs):Observable

要将此数据发送到您的后端,您应该使用post api

let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });

return this.http.post('/api/ordersspecyfic', ids, options)
  

post(url:string,body:any,options?:RequestOptionsArgs):Observable

来源:https://angular.io/docs/ts/latest/api/http/index/Http-class.html

答案 1 :(得分:1)

两个错误,后端和前端。

  1. 前端错误
  2. 你说this.http.get('/api/ordersspecific', ids);。这没有任何作用 - 或者具体地说,这只是试图得到/api/ordersspecific。它没有发送ID,您的第二个参数与任何RequestOptions都不匹配。换句话说,你的id被忽略了。

    您希望将此附加为查询字符串。检查here如何添加查询字符串参数。但简而言之,它就像是一样简单:

    return this.http.get('/api/ordersspecyfic?ids=<id1>&ids=<id2>...'
    
    1. 后端错误
    2. 你正在读取身体上的东西。这是一个GET请求,应该没有正文。从querystring中读取这个:

      router.get('/ordersspecyfic', function(req, res, next){
        var ids = req.query.ids;
      });