我在javascript和节点js中有一个奇怪但很简单的数组问题?

时间:2017-04-21 11:23:53

标签: javascript

非常简单的问题,浪费我的时间几个小时:我只是尝试将数据推送到我的架构中存在的数组但是当我使用.push我得到错误'无法读取未定义的属性推送'这是我非常简单的代码:

var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/new_try1");

var productSchema = new mongoose.Schema({
    number: Number,
    name: String
});

var Product = mongoose.model("Product", productSchema);

var orderSchema = new mongoose.Schema({
    number: Number,
    name: String,
    products: [productSchema]
});

var Order = mongoose.model("Order", orderSchema);

var newOrder = new Order({
    number: "123",
    name: "jane"
});


newOrder.save(function (err, order) {
    if (err) {
        console.log(err);
    } else {
        console.log(order);
    }
});
Order.find({
    name: 'jane'
}, function (err, order) {
    if (err) {
        console.log(err)
    } else {
        console.log(order);// I can see the products array in cmd
        console.log(order.products);// I got undefined here!!!!!????
        order.products.push({// here I got error can not read of un....
            number:456,
            name:'carret'
        });
        order.save(function(err,found){
            if (err){
            console.log(err);   
            }else{
                console.log(found);
            }
        })
    }
});

当运行服务器时,我在cmd中得到了这个命令:

[{_id:357636shgs65dh5sd4h65d,
number:'123',
name:'jane',
__v:0,
products:[] }]

现在为什么order.product在我在这里看到时是未定义的?

2 个答案:

答案 0 :(得分:1)

为了简单起见,看起来顺序就是这样:

var order=[
       {_id:357636shgs65dh5sd4h65d,
           number:'123',
           name:'jane',
           __v:0,
           products:[] 
        }];

正如您可以看到 Array 而不是 Object 。所以你首先需要得到数组的对象:

order //the array
  [0] //the object
  .products //the product array
  .push()//should work now

collection.find 将光标返回到集合,需要迭代(= Arraylike) 所以你可能想用 collection.findOne 只返回一个元素,使您的代码有效。

https://docs.mongodb.com/v3.2/reference/method/db.collection.find/ https://docs.mongodb.com/v3.2/reference/method/db.collection.findOne/

Order.findOne({
  name: 'jane'
}, function (err, order) {
   order.push("data");
});

答案 1 :(得分:0)

看起来您的订单是一个数组。所以像这样的事情应该有效:

Order.find({
    name: 'jane'
}, function (err, order) {
    if (err) {
        console.log(err)
    } else {
        console.log(order);// I can see the products
        console.log(order[0].products);
        order[0].products.push({
            number:456,
            name:'carret'
        });
        order.save(function(err,found){
            if (err){
            console.log(err);   
            }else{
                console.log(found);
            }
        })
    }
});

注意:我不确定你的用例。但看起来您可以从数据库中检索多个订单,因此您可能希望循环返回处理的订单