尝试更新Express

时间:2017-01-15 22:59:44

标签: node.js express mongoose

我有一个Mongoose模型,它有嵌套数组和子文档。

发布到对象数组/子文档时,我似乎没问题,但是我遇到了.put

的问题

我对params进行了硬编码测试,以防他们因某些原因没有从PostMan进来。

我从上面的代码得到的结果是一个空数组!

所以我得到了正确的记录,它创建了“手机”数组,但没有填充。

.put(function(req, res){
  Member.find({'_id':req.params.id}, function(err, member){
    if(err)
      res.send(err);

      member.phone.push({
        number: "78787878787",
        phoneType: 2
      })


    member.save(function(err){
      if(err)
        res.send(err);
      res.json(member);
    });
  });
});

我想要一个只添加另一个“电话”记录的端点。

这是我的模特:

//DEPENDENCIES
var mongoose = require('mongoose');


var contactSchema = new mongoose.Schema({
  name:{type:String},
  age:{type:Number}
});

var phoneSchema = new mongoose.Schema({
  number:{ type: String },
  phoneType:{ type: Number }
})

var memberSchema = new mongoose.Schema({

  firstname: {
    type: String
  },
  lastname: {
    type: String
  },
  phone:[phoneSchema],
  contacts:[contactSchema]

  });

//RETURN MODEL

module.exports = mongoose.model('member', memberSchema);

现在当我运行我的代码时,我得到以下未定义的“成员”:

{ id: '587bcbffe64e9f28a6894dd7' }
[ { _id: 587bcbffe64e9f28a6894dd7,
    lastname: 'Stanley',
    firstname: 'Dave',
    __v: 0,
    contacts: [ [Object] ],
    phone: [] } ]
events.js:154
      throw er; // Unhandled 'error' event
      ^

TypeError: Cannot read property 'push' of undefined

1 个答案:

答案 0 :(得分:1)

find返回一个文档数组,而不仅仅是一个文档。这就是为什么当你尝试member.phone时它会出错。

findOne使用find代替querying _idreturn只会null只有一个匹配的文档或find(如果result它不存在),所以它比null更好。

此外,最好检查member是否为null。如果不存在_idMember.findOne({'_id':req.params.id}, function(err, member){ if(err) res.send(err); else if(member!=null) { member.phone.push({ number: "78787878787", phoneType: 2 }); member.save(function(err){...}); } }); 将为find

member[0]

如果您热衷于使用member。使用Member.find({'_id':req.params.id}, function(err, member){ if(err) res.send(err); else if(member.length!=0) { member[0].phone.push({ number: "78787878787", phoneType: 2 }); member[0].save(function(err){...}); } }); (第一个元素)代替page-tables.php

<?php
/*
Template Name: Tables
*/

get_header();

$meta      = get_post_meta();
$name      = ( isset( $meta['nameTxt'][0] ) && '' !== $meta['nameTxt'][0] ) ? $meta['nameTxt'][0] : '';
$branch    = ( isset( $meta['branchTxt'][0] ) && '' !== $meta['branchTxt'][0] ) ? $meta['branchTxt'][0] : '';
$sem       = ( isset( $meta['semTxt'][0] ) && '' !== $meta['semTxt'][0] ) ? $meta['semTxt'][0] : '';
$subject   = ( isset( $meta['subTxt'][0] ) && '' !== $meta['subTxt'][0] ) ? $meta['subTxt'][0] : '';
$time_from = ( isset( $meta['timeFromTxt'][0] ) && '' !== $meta['timeFromTxt'][0] ) ? $meta['timeFromTxt'][0] : '';
$time_to   = ( isset( $meta['timeToTxt'][0] ) && '' !== $meta['timeToTxt'][0] ) ? $meta['timeToTxt'][0] : '';
?>

<table  width="350px" border="1">
    <tr>
        <td>
            <?php esc_html_e( 'Your Name', 'your_theme_slug' ); ?>
        </td>
        <td>
            <input type="text" value="<?php echo esc_attr( $name ); ?>" name="nameTxt">
        </td>
    </tr>
</table>
<input type="button" class="add_row_button" value="<?php esc_attr_e( 'Add Row', 'your_theme_slug' ); ?>"/>
<table id="dataTable" width="350px" border="1">
    <tr>
        <td>
            <input type="button" class="delete_row_button" value="<?php esc_attr_e( 'Delete', 'your_theme_slug' ); ?>">
        </td>
        <td class="row_no">1</td>
        <td>
            <?php esc_html_e( 'Branch', 'your_theme_slug' ); ?>
        </td>
        <td>
            <input type="text" value="<?php echo esc_attr( $branch ); ?>" name="branchTxt">
        </td>
        <td><?php esc_html_e( 'Sem', 'your_theme_slug' ); ?></td>
        <td>
            <input type="text" value="<?php echo esc_attr( $sem ); ?>" name="semTxt">
        </td>
        <td><?php esc_html_e( 'Subject', 'your_theme_slug' ); ?></td>
        <td>
            <input type="text" value="<?php echo esc_attr( $subject ); ?>" name="subTxt">
        </td>
        <td><?php esc_html_e( 'Time From', 'your_theme_slug' ); ?></td>
        <td>
            <input type="text" value="<?php echo esc_attr( $time_from ); ?>" name="timeFromTxt">
        </td>
        <td><?php esc_html_e( 'Time To', 'your_theme_slug' ); ?></td>
        <td>
            <input type="text" value="<?php echo esc_attr( $time_to ); ?>" name="timeToTxt">
        </td>
    </tr>
</table>

<?php get_footer();

希望对你有所帮助。