【问题标题】:Undefined returned from object从对象返回未定义
【发布时间】:2018-08-22 13:49:46
【问题描述】:

在下面的代码中,当我尝试控制台记录数据对象时,它会返回正确的用户名和密码,如下所示。

[ { _id: 5b7d6366db5064296cbeb79c,
    username: 'ajith',
    password: 'sdf2343@3e!',
    __v: 0 } ]

但是 data.username 的控制台日志返回 undefined。为什么会这样?为什么它没有返回值?

var express = require('express');
var app = express();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended:true}));

mongoose.connect
("mongodb://<user>:<pass>@ds129762.mlab.com:29762/<dbnmae>")

var userSchema = new mongoose.Schema({
     username : String,
     password : String
});

var User = mongoose.model("User",userSchema);

app.get("/",function(req,res){
   User.find({"username": "ajith"},function(err,data){
      if(err){
         console.log(err);
      }else{
        console.log(data);
        console.log(data.password+" "+data._id);
      }
    });
});


app.listen(3000,function(){
    console.log("server started and listening at the port 3000");
});

【问题讨论】:

  • data 是一组(或在本例中为一个)对象

标签: javascript node.js


【解决方案1】:

您必须使用data[0].username,因为data 是一个包含单个值的数组。

【讨论】:

    【解决方案2】:

    User.find() 将返回一个数组结果。因此,您需要使用findOne() 查询。

    User.findOne({"username": "ajith"},function(err,data){
       if(err){
           console.log(err);
       }else{
         console.log(data);
         console.log(data.password+" "+data._id);
       }
    });
    

    如果您对所有文档都有唯一的username 属性,那么始终建议使用findOne() 查询唯一的query 组合,而不是使用返回数组的find(),因为您期望来自单个文档猫鼬查询。当您为相同的代码编写测试用例时,这也是有利的,因为您可以断言对象响应而不是数组响应。

    【讨论】:

      【解决方案3】:

      它没有返回任何东西,因为data 是一个数组。如果您只想访问该数组的第一个元素,请使用

      console.log(data[0].password+" "+data[0]._id);
      

      或者,如果要查看所有元素,请使用循环:

      data.forEach(d => console.log(d.password+" "+d._id);
      

      如果您只希望从 MongoDB 返回一个文档,请使用Model#findOne

      User.findOne({
        "username": "ajith"
      }, function(err, user) {
        if (err) {
          console.log(err);
        } else {
          console.log(user);
          console.log(user.password + " " + user._id);
        }
      });
      

      【讨论】:

        【解决方案4】:

        这通常发生在您没有为输出定义的专用类型,而是一个对象、数组等(通常它是一个没有字段的根对象)时。 因此,在您的情况下,它本身返回一个对象,然后向您显示里面的内容,但您不能调用它的字段,因为您的应用对它们一无所知。

        【讨论】:

          猜你喜欢
          • 2016-01-30
          • 2017-07-11
          • 1970-01-01
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多