복붙노트

[MONGODB] 몽구스 / MongoDB의 결과 필드는 자바 스크립트에서 정의되지 않은 나타납니다

MONGODB

몽구스 / MongoDB의 결과 필드는 자바 스크립트에서 정의되지 않은 나타납니다

나는 그 항목이 매개 변수를 대상으로 로그온 할 수 있도록 것이다 누락하는 것이 뭔가입니다,하지만 난 매개 변수에 대한 액세스하려고 할 때, 그것은 정의되지 않은거야?

내가 지금까지 시도했다 :

나는이 문제에 관련이있는 경우를 문맥의 일부를 포함하는 것입니다.

var TextController = function(myCollection) {
  this.myCollection = myCollection
}

TextController.prototype.list = function(req, res, next) {
  this.myCollection.find({}).exec(function(err, doc) {
    var set = new Set([])
    doc.forEach(function(item) {
      console.log(item)         // Here item shows the parameter
      console.log(item.title)   // "undefined"
      set.add(item.title)       
    })
    res.json(set.get());
  })
}

제안을 바탕으로 전 항목이 실제로 노드 REPL 디버거를 통해 무엇인지 확인하기 위해이 행하기 전에 디버거를 떨어졌다. http://hastebin.com/qatireweni.sm : 이것은 내가 찾은 것입니다

이 나는 노력을 console.log에서 (item._doc.title)과는 잘 .. 그래서,이 더 지금 무엇보다 몽구스 질문처럼 보인다 작품.

이 이와 비슷한 질문을하지만, 오브젝트에 접근하거나 기능의 범위를 벗어난 객체를 얻기 위해 노력하고 '이'과 관련이있을 것으로 보인다. 이 경우, 나는 두 사람의 일을 해요 생각하지만, 내가 틀렸다면 저를 통보하지 않습니다. 감사

해결법

  1. ==============================

    1.당신은 필드에 액세스하기 위해 toObject 메소드를 호출 할 수 있습니다. 예를 들면 :

    당신은 필드에 액세스하기 위해 toObject 메소드를 호출 할 수 있습니다. 예를 들면 :

    var itemObject = item.toObject();
    console.log(itemObject.title); // "foo"
    

    당신이 지적으로 실제 필드는 문서의 _doc 필드에 저장됩니다.

    그런데 왜 CONSOLE.LOG (항목) => {제목 : "foo는"콘텐츠 "바"}?

    몽구스 (document.js)의 소스 코드에서, 우리는 문서의 toString 메소드는 toObject 메소드를 호출 것을 찾을 수 있습니다. '제대로'필드가 표시됩니다 그래서 CONSOLE.LOG. 소스 코드는 다음과 같습니다 :

    var inspect = require('util').inspect;
    
    ...
    
    /**
     * Helper for console.log
     *
     * @api public
     */
    Document.prototype.inspect = function(options) {
      var isPOJO = options &&
        utils.getFunctionName(options.constructor) === 'Object';
      var opts;
      if (isPOJO) {
        opts = options;
      } else if (this.schema.options.toObject) {
        opts = clone(this.schema.options.toObject);
      } else {
        opts = {};
      }
      opts.minimize = false;
      opts.retainKeyOrder = true;
      return this.toObject(opts);
    };
    
    /**
     * Helper for console.log
     *
     * @api public
     * @method toString
     */
    
    Document.prototype.toString = function() {
      return inspect(this.inspect());
    };
    
  2. ==============================

    2.당신이 당신의 스키마에 제목을 정의했는지 확인 :

    당신이 당신의 스키마에 제목을 정의했는지 확인 :

    var MyCollectionSchema = new mongoose.Schema({
        _id: String,
        title: String
    });
    
  3. ==============================

    3.항목 위에 루프에 대한을 수행하고 값을 액세스 할 수 있는지.

    항목 위에 루프에 대한을 수행하고 값을 액세스 할 수 있는지.

    for (var k in item) {
        console.log(item[k]);
    }
    

    그것이 작동하는 경우, 그것은 당신의 키가이 같은 일부 인쇄 할 수없는 문자 또는 무언가를 의미 할 것입니다.

    어떻게 든 항목이 문자열 원시 래퍼의 인스턴스처럼 당신이 코멘트에 말에서, 그것은 보인다.

    EG

    var s = new String('test');
    typeof s; //object
    s instanceof String; //true
    

    이 이론을 확인하려면 다음을 수행하십시오

    eval('(' + item + ')').title;
    

    또한 항목이 표시 당신이 무엇을보고하는 toString 메서드를 가진 개체라고 할 수있다.

    편집 :이 개체 속성의 상호 작용 목록을 표시하기 때문에 당신은 CONSOLE.LOG 대신 console.dir 사용할 수 있습니다, 빨리이 문제를 식별합니다. 또한 만 중단 점 및 시계를 추가 할 수 있습니다.

  4. ==============================

    4.당신은, 공백 또는 '제목'에 이상한 문자가없는 당신은? 당신은 객체 /지도 정의에 식별자를 인용 한 경우 그들은 정의 할 수 있습니다. 예를 들면 :

    당신은, 공백 또는 '제목'에 이상한 문자가없는 당신은? 당신은 객체 /지도 정의에 식별자를 인용 한 경우 그들은 정의 할 수 있습니다. 예를 들면 :

    var problem = {
        ' title': 'Foo',
        'content': 'Bar'
    };
    

    그 힘의 원인을 console.log (항목) 당신이 기대하고있는 것과 유사한 표시하지만, 당신이 공간을 이전 것없이 제목 속성에 액세스 할 때 정의되지 않은 문제가 발생할 수 있습니다.

  5. ==============================

    5.나는 '발견'메소드가 리턴을 사용하여 생각 Documents.I의 배열이 시도하고 나는 제목을 인쇄 할 수 있었다

    나는 '발견'메소드가 리턴을 사용하여 생각 Documents.I의 배열이 시도하고 나는 제목을 인쇄 할 수 있었다

    for (var i = 0; i < doc.length; i++) {
       console.log("iteration " + i);
       console.log('ID:' + docs[i]._id);
       console.log(docs[i].title);
    }
    
  6. ==============================

    6.오래된 질문,하지만 난 너무이 문제를 가지고 있기 때문에, 나는 그것을 답변 해 드리겠습니다. 당신이 발견을 사용하고 있기 때문에 아마 일이 () 대신 findOne의 (). 그래서 결국, 당신은 배열을 발견의 결과로 대신 문서의 문서의 배열하는 방법이 아니라 하나의 문서를 호출하고 있습니다. findOne를 사용하여 ()는 일반적으로 액세스에게 개체를 얻을 수있게된다.

    오래된 질문,하지만 난 너무이 문제를 가지고 있기 때문에, 나는 그것을 답변 해 드리겠습니다. 당신이 발견을 사용하고 있기 때문에 아마 일이 () 대신 findOne의 (). 그래서 결국, 당신은 배열을 발견의 결과로 대신 문서의 문서의 배열하는 방법이 아니라 하나의 문서를 호출하고 있습니다. findOne를 사용하여 ()는 일반적으로 액세스에게 개체를 얻을 수있게된다.

  7. ==============================

    7.더 좋은 방법은이 같은 문제는이 같은 doc.toObject ()를 사용하고 해결하기 위해

    더 좋은 방법은이 같은 문제는이 같은 doc.toObject ()를 사용하고 해결하기 위해

    doc.toObject({ getters: true })
    

    다른 옵션은 다음과 같습니다 :

    그래서 예를 들어, 당신은 말할 수

    Model.findOne().exec((err, doc) => {
       if (!err) {
          doc.toObject({ getters: true })
          console.log('doc _id:', doc._id) // or title
       }
    })
    

    지금은 작동합니다

  8. ==============================

    8.당신은 단지 모든 몽구스 혜택없이 정보를 얻고 싶다면, 즉 저장, 당신은 당신의 쿼리에서 () .lean 사용할 수 있습니다. 그것은 빨리 귀하의 정보를 얻을 것이다 당신은 직접 객체로 사용할 수 있습니다.

    당신은 단지 모든 몽구스 혜택없이 정보를 얻고 싶다면, 즉 저장, 당신은 당신의 쿼리에서 () .lean 사용할 수 있습니다. 그것은 빨리 귀하의 정보를 얻을 것이다 당신은 직접 객체로 사용할 수 있습니다.

    https://mongoosejs.com/docs/api.html#query_Query-lean

    문서에서 말했듯이, 이것은 최선의 읽기 전용 시나리오입니다.

  9. ==============================

    9.사용 findOne () 대신 발견의 ().

    사용 findOne () 대신 발견의 ().

    찾기 () 메소드는 당신이 단지 하나 개의 가능한 결과를 경우에도, 값의 배열을 반환합니다, 당신은 그것을 얻기 위해 사용 항목 [0]으로해야합니다.

    findOne 메서드가 반환 한 개체 또는 없음은, 당신은 문제없이 해당 속성에 액세스 할 수 있습니다.

  10. ==============================

    10.당신은 당신의 객체를 초기화하고 있습니까?

    당신은 당신의 객체를 초기화하고 있습니까?

    function MyObject()
    {
        this.Title = "";
        this.Content = "";
    }
    
    var myo1 = new MyObject();
    

    당신은 초기화하지 마십시오 또는 제목을 설정하지 않은 경우. 당신은 정의되지 않은 얻을 것이다.

  11. from https://stackoverflow.com/questions/18710043/mongoose-mongodb-result-fields-appear-undefined-in-javascript by cc-by-sa and MIT license