Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从外部函数更新对象?_Javascript_Node.js_Mongoose_Scope - Fatal编程技术网

Javascript 如何从外部函数更新对象?

Javascript 如何从外部函数更新对象?,javascript,node.js,mongoose,scope,Javascript,Node.js,Mongoose,Scope,与这只猫鼬的功能斗争。我试图在另一个嵌入对象中添加一个嵌入对象,但它将新的bid对象添加到了错误的位置——我为迭代器创建的newlistings变量。 我的for循环试图找到要更新的确切列表,因此我认为分配它们的操作会把它们搞乱。例如,如果列表是users[2]。列表[10]。bids,如何访问该对象以便更新它 function create(req, res) { db.Listing.findById(req.params.listingId, function(err, found

与这只猫鼬的功能斗争。我试图在另一个嵌入对象中添加一个嵌入对象,但它将新的bid对象添加到了错误的位置——我为迭代器创建的newlistings变量。 我的for循环试图找到要更新的确切列表,因此我认为分配它们的操作会把它们搞乱。例如,如果列表是
users[2]。列表[10]。bids
,如何访问该对象以便更新它

 function create(req, res) {
   db.Listing.findById(req.params.listingId, function(err, foundListing) {
    // console.log(foundListing._id );
    if (err) {
      console.log('Error', err);
    }
     // res.json(foundListing);
     // get array of all users
    db.User.find({}, function(err, users) {
      // for loop iterates through all users' listings
      for (let i = 0; i < users.length; i++) {
        let listings = users[i].listings
        // for loop iterates through all listings ids
        for (let j = 0; j < listings.length; j++) {
          // finds match
          // comparing _id with _id returning false. Not sure why, will return later
          if (listings[j].topic === foundListing.topic && listings[j].created === foundListing.created) {
            console.log("Found match: " + foundListing.topic);
            // get current user id to add to bid object
            db.User.findById(req.user, function(err, user) {
              if (err) {
                console.log(err);
              }
              var newBid = new db.Bid(req.body); // add data validation later
              newBid.uid = user._id
              // pushes new bid object into embedded listing
              listings[j].bids.push(newBid);
              listings[j].save(function(err, savedBid) {
               console.log('newBid created: ', newBid);
               console.log(listings[j]);
               res.json(newBid);
              });
            });
          }
        }
      }
    })
    if (err) {
      console.log(err);
    }
  });
};
函数创建(req,res){
db.Listing.findById(req.params.listingId,函数(err,foundListing){
//console.log(foundListing.\u id);
如果(错误){
console.log('Error',err);
}
//res.json(foundListing);
//获取所有用户的数组
db.User.find({},函数(err,users){
//for循环遍历所有用户的列表
for(设i=0;i
编辑-到目前为止,但现在我的数组似乎没有保存

function create(req, res) {
  db.Listing.findById(req.params.listingId, function(err, foundListing) {
    if (err) {
      console.log('Error:', err);
    }
    db.User.findOne({ 'listings._id': req.params.listingId }, function(err, foundUser) {
      // console.log(foundUser.listings);
      if (err) {
        console.log('Error: ', err);
      }
      for (let i = 0; i < foundUser.listings.length; i++) {
        // console.log(foundUser.listings[i]._id);
        if (foundUser.listings[i]._id == req.params.listingId) {
          console.log( 'found it! - ' + foundUser.listings[i].topic);
          var newBid = new db.Bid(req.body);
          // console.log(newBid)
          foundUser.listings[i].bids.push(newBid);
          console.log(foundUser.listings[i].bids)
          foundUser.listings[i].save(function(err, savedListing) {
            // console.log(foundUser.listings[i])
            if (err) {
              console.log('Error: ', err);
              return;
            }
              console.log('newBid created: ', newBid);
              console.log('savedListing', savedListing);
              res.json(newBid);
          })
        }
      }
    })
  });
};
函数创建(req,res){
db.Listing.findById(req.params.listingId,函数(err,foundListing){
如果(错误){
log('Error:',err);
}
db.User.findOne({'listings.u id':req.params.listingId},函数(err,foundUser){
//console.log(foundUser.listings);
如果(错误){
log('Error:',err);
}
for(设i=0;i
你的代码很难掌握。我认为你可能使用了错误的工具来解决这个问题。MongoDb和Mongoose似乎具有相当高级的查询功能,因此您可以指定您感兴趣的确切用户、列表等

我认为值得您花时间看一看文档,或许也可以。
db.User.findOne({'listings.id':req.params.listingId}
中用于
listings.id

我无法真正测试这段代码是否可以编译,或者它是否可以工作,因为我对您的数据库模型等了解不够,但应该可以做到以下几点:

 function create(req, res) {
   db.Listing.findById(req.params.listingId, function(err, foundListing) {
    // use the power of mongo db and mongoose.
    // you can specify more exactly what you're looking for
    // in this case we're interested in ONE user that
    // has a listing with a specific id  
    // (if you still problems with comparing identical IDs, then that's a serious issue..
    //  maybe try logging req.params.listingId and check if it really exists
    // in your database.)
    db.User.findOne({ 'listings.id': req.params.listingId }, function(err, foundUser) {
      var newBid = new db.Bid(req.body); // add data validation later
      newBid.uid = foundUser._id

      // Old code: foundListing.bids.push(newBid) 

      // Change according to first question/answer at  http://mongoosejs.com/docs/faq.html
      // which was linked in the thread you linked to in comment.
      // The essence is that Mongoose doesn't get
      // notified about changes to arrays by default
      // To get around this you can update using "set"
      // but then you need both a value and an index:
      var oldBidsLength = foundListing.bids.length;
      foundListing.bids.set(oldBidsLength, newBid);     

      foundListing.save(function(err, savedBid) {
        // savedBid  =  saved LISTING? 
        console.log('newBid created: ', newBid);
        console.log('savedBid', savedBid);
        res.json(savedBid);
        }
      }
    })
  });
};

这个代码示例中可能会出现的问题是if
db.User.findOne({'listings.id':req.params.listingId}
应与
列表一起使用。\u id
。我对您的型号了解不够。

您到底想在这里做什么?您希望新id放在哪里?尝试提供更多详细信息我有一个包含嵌入式列表的用户集合。因此一个用户可以有多个列表。然后每个列表可以有多个出价(响应)嵌入在列表中。由于其设置方式,当一个人响应出价时,该功能将搜索该列表所在的位置(嵌入到用户中)一旦找到列表,bid对象将被推送到该用户对象中嵌入的列表对象中。我的问题是,它不会推到原始列表数组中,而是被推到我为迭代器创建的列表变量数组中。如果变量名发生冲突,则只需重命名其中一个即可。
let userListings=users[i].listings
看起来也有点可笑,你有一个叫做
req.user
的东西,你用它来通过id找到一个用户。但是你只是请求获得用户,这样你就可以获得用户id。你不是已经在
req.user
或可能的
req.user.id
中有了用户id吗?我的for循环正在试图找到它他需要更新确切的列表,因此我认为分配它们的操作会把它们搞乱。例如,如果列表是
用户[2]。列表[10].bids
,我如何到达该对象以便更新它?我很感谢您的回复,并将尝试此功能!我四处寻找示例,并通过演练演示了与我的原始帖子类似的内容。因此,我已将出价嵌入到嵌入用户的列表中,并且我正在尝试根据我响应的列表添加新出价(使用AngularJS使listingId工作)好的,是的,我可能对betwe的重叠是错误的