如何限制从Node返回到angular2应用程序的响应?

时间:2016-06-16 16:02:45

标签: node.js mongodb angular response mean-stack

在我的应用程序中,我的用户能够与许多不同类型的对象(physical_drives,设备,配置文件,主题,文章和消息)相关联。所有这些关联都基于用户模型存储在用户对象中。我想弄清楚的是,我如何限制API查询的响应来做一些事情,比如创建一个新设备返回系统知道用户的所有内容,因为用户与设备有关。 / p>

创建新设备如下所示:

router.post('/', function(req, res, next) {
var decoded = jwt.decode(req.query.token);
User.findById(decoded.user._id, function(err, doc) {
    if (err) {
        return res.status(401).json({
            title: 'An Error occured',
            error: err
        });
    }
    var device = new Device({
        model_name: req.body.model_name,
        model_number: req.body.model_number,
        serial_number: req.body.serial_number,
        wwnn: req.body.wwnn,
        user: doc
        //  topic: req.body.topicId   // use this line for adding reference IDs if needed
    });
    console.log(req.body);
    console.log(' About to Save Device...');
    device.save(function(err, result){
        if (err) {
            return res.status(404).json({
                title: 'An Error occured',
                error: err
            });
        }
        doc.devices.push(result);
        doc.save();
        res.status(201).json({
            device: 'Saved Device',
            obj: result
        });
    });
});
});

我的设备型号的架构如下所示:

var schema = new Schema({
model_name: {type: String, required: false},
model_number: {type: String, required: false},
serial_number: {type: String, required: false, unique: true},
wwnn: {type: String, required: false},
user: {type: Schema.Types.ObjectId, ref: 'User'}
});

我的用户模型的架构如下所示:

var schema = new Schema({
password: {type: String, required: true},
email: {type: String, required: true, unique: true},
messages: [{type: Schema.Types.ObjectId, ref: 'Message'}],
articles: [{type: Schema.Types.ObjectId, ref: 'Article'}],
topics: [{type: Schema.Types.ObjectId, ref: 'Topic'}],
profiles: [{type: Schema.Types.ObjectId, ref: 'Profile'}],
devices: [{type: Schema.Types.ObjectId, ref: 'Device'}],
physical_drives: [{type: Schema.Types.ObjectId, ref: 'Physical_drive'}]
});

所以每当我创建一个新设备并返回obj:result时:

    res.status(201).json({
        device: 'Saved Device',
        obj: result
    });

我得到回复:其中包含用户配置文件的太多信息,相反,我想限制它只返回用户对象的特定字段。

{
"device": "Saved Device",
"obj": {
"__v": 0,
"model_name": "MyGreatModelName",
"model_number": "MyAwesomeModelNumber",
"serial_number": "MyFantasticSerial2",
"wwnn": "MyWorldWideNode",
"user": {
  "_id": "5755e5be96162f52a4f01dd8",
  "firstName": "Jason",
  "lastName": "Perr",
  "password": "sha1$6a807c98$1$2cfa76795b63b23d7ae0fea1715156b3390293b9",
  "email": "myGreatEmail@gmail.com",
  "__v": 139,
  "physical_drives": [
    "5761e971e8490444e4b78f23",
    "5761eb35a6bfba5ae5ed2db0",
    "5761fda47c754be2ebe5276c",
    "5761fdd07c754be2ebe5276d"
  ],
  "devices": [
    "5761a1933509fb50b7a275cb",
    "5761a33deb792d5db85e0f79",
    "5761c8ce72318160d2ff99f9",
    "5761cc19740a1a0fd4436ee5",
    "5761fc1d7c754be2ebe5276a",
    "5761fcef7c754be2ebe5276b",
    "5762c3417c754be2ebe52774",
    "5762c34c7c754be2ebe52775"
  ],
  "profiles": [
    "57608d27abcb9ee83dcfe9d3",
    "5761875afb99e9b4a91af310",
    "57618c3cfb99e9b4a91af311",
    "57619bdffb99e9b4a91af313",
    "5761afb6ecbd0581c0b95d0d",
    "5761bc659084f6ffc803d928",
    "5761bf0ac8ae3803cbbaf660",
    "5761c073c8ae3803cbbaf664",
    "5761c2f56400173cce830cb0",
    "5761c8b072318160d2ff99f8"
  ],
  "topics": [
    "5755e71696162f52a4f01dde",
    "57572d92e802307d199f0afa",
    "57572da8e802307d199f0afb"
  ],
  "articles": [
    "5755e78a138e28f6a4fd34e7",
    "5755ea7e138e28f6a4fd34e8",
    "5755f8bddbce43cba958c23f",
    "5755f919dbce43cba958c240",
    "5755fa5d0a556423acedf0e2",
    "5755fbec0a556423acedf0e3",
    "5756f65f0a556423acedf0e4",
    "5756f6d40a556423acedf0e5",
    "57571989ab19798208f4e08e",
    "5757198fab19798208f4e08f",
    "575881f51ac787521d15ac29",
    "575882071ac787521d15ac2a",
    "575882dc1ac787521d15ac2b",
    "5758b8c11ac787521d15ac36",
    "5758b9731ac787521d15ac37",
    "5758ba761ac787521d15ac38",
    "5758bc391ac787521d15ac39",
    "5758bce01ac787521d15ac3a",
    "5758bd7e1ac787521d15ac3b",
    "5758bdb51ac787521d15ac3c",
    "5758be841ac787521d15ac3d",
    "5758befd1ac787521d15ac3e",
    "5758bfea1ac787521d15ac3f",
    "5758c0c31ac787521d15ac40",
    "5758c2e173fd33e04092c87e",
    "575992d473fd33e04092c87f",
    "5759956173fd33e04092c880",
    "575995a073fd33e04092c881",
    "57599bc573fd33e04092c882",
    "57599f4c73fd33e04092c883",
    "57599fe673fd33e04092c884",
    "5759a07573fd33e04092c885",
    "5759aace73fd33e04092c886",
    "5759ab2673fd33e04092c887",
    "5759ac3c73fd33e04092c888",
    "5759acbd73fd33e04092c889",
    "5759acdd73fd33e04092c88a",
    "5759ad2673fd33e04092c88b",
    "5759adc673fd33e04092c88c",
    "5759ae6773fd33e04092c88d",
    "5759af3b73fd33e04092c88e",
    "5759b18073fd33e04092c88f",
    "5759b2ad73fd33e04092c891",
    "5759b45e73fd33e04092c892",
    "5759b4b173fd33e04092c893",
    "5759b59a73fd33e04092c894",
    "575b6a67dd42b19c39dcfa77",
    "575b6f6f03d2aa3d3c3e98f9",
    "575b6ffb03d2aa3d3c3e98fa",
    "575b70f5874fdbc63d317998",
    "575b71c2874fdbc63d317999",
    "575b723b874fdbc63d31799a",
    "575b7468fd4302593f754eae",
    "57606d125b7701e5346075aa",
    "57606dba5b7701e5346075ab",
    "57606e065b7701e5346075ac",
    "57606e835b7701e5346075ad",
    "57606edc5b7701e5346075ae",
    "57606f1a5b7701e5346075af",
    "5761824883f2a99ba5d3b071",
    "5761829b83f2a99ba5d3b072",
    "57619b8efb99e9b4a91af312"
  ],
  "messages": [
    "5755e5da96162f52a4f01dda",
    "5755e6db96162f52a4f01ddb",
    "5755e6e196162f52a4f01ddc",
    "5755e70396162f52a4f01ddd",
    "5759b1a973fd33e04092c890"
  ]
},
"_id": "5762c34c7c754be2ebe52775"
}
} 

任何人都知道如何限制这个?理想情况下,我想得到的反应看起来更像是这样:

{
"device": "Saved Device",
"obj": {
  "__v": 0,
  "model_name": "MyGreatModelName",
  "model_number": "MyAwesomeModelNumber",
  "serial_number": "MyFantasticSerial2",
  "wwnn": "MyWorldWideNode",
  "user": {
    "_id": "5755e5be96162f52a4f01dd8",
    "firstName": "Jason",
    "lastName": "Perr",
    "__v": 139,
    "physical_drives": [
      "5761e971e8490444e4b78f23",
      "5761eb35a6bfba5ae5ed2db0",
      "5761fda47c754be2ebe5276c",
      "5761fdd07c754be2ebe5276d"
    ],
    "devices": [
      "5761a1933509fb50b7a275cb",
      "5761a33deb792d5db85e0f79",
      "5761c8ce72318160d2ff99f9",
      "5761cc19740a1a0fd4436ee5",
      "5761fc1d7c754be2ebe5276a",
      "5761fcef7c754be2ebe5276b",
      "5762c3417c754be2ebe52774",
      "5762c34c7c754be2ebe52775"
    ],
  },
  "_id": "5762c34c7c754be2ebe52775"
}
}

1 个答案:

答案 0 :(得分:0)

您始终可以创建自定义对象,但这将是一项很多手动工作。但它值得因为网络流量可以带来很大的性能提升。 所以这就是你可以这样做的方式

res.status(201).json({
        device: 'Saved Device',
        obj: {
        Key1 : result.value1,
        Key2 : result.value2

}
    });

依旧......