Mongoose/MongoDB 결과 필드가 Javascript에서 정의되지 않은 것으로 나타납니다.
항목을 매개 변수가 있는 개체로 기록할 수 있는 누락된 항목이 있습니까? 그러나 해당 매개 변수에 액세스하려고 하면 정의되지 않습니다.
제가 지금까지 시도한 것:
console.log(item)=>{ title: "foo", content: "bar" },괜찮아요.console.log(typeof item)=> 객체console.log(item.title)=> "계속"
문제와 관련이 있을 경우를 대비하여 몇 가지 맥락을 포함하겠습니다.
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());
})
}
내가 삭제한 제안에 따라debugger노드 복제 디버거를 통해 실제로 어떤 항목인지 확인하려면 이 줄 앞에 있어야 합니다.이것이 제가 찾은 것입니다: http://hastebin.com/qatireweni.sm
이것으로 나는 노력했습니다.console.log(item._doc.title)그리고 그것은 잘 작동합니다.그래서, 이것은 무엇보다도 지금 몽구스 질문처럼 보입니다.
이와 유사한 질문들이 있지만, 그것들은 객체의 '이것' 접근과 관련이 있거나 함수의 범위 밖으로 객체를 가져오려고 하는 것으로 보입니다.이 경우, 저는 그것들 중 어느 것도 하고 있지 않다고 생각하지만, 제가 틀렸다면 저에게 알려주세요.감사해요.
해결책
당신은 전화할 수 있습니다.toObject메소드를 사용하여 필드에 액세스할 수 없습니다.예:
var itemObject = item.toObject();
console.log(itemObject.title); // "foo"
왜죠
실제 필드는 문서의 필드에 저장됩니다.
근데 왜요?console.log(item)=>{ title: "foo", content: "bar" }?
mongoose(document.js)의 소스 코드로부터, 우리는 다음을 찾을 수 있습니다.toString의 방법Document을 부르다toObject방법.그렇게console.log필드에 'filename'이 표시됩니다.소스 코드는 다음과 같습니다.
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());
};
스키마에 정의된 제목이 있는지 확인합니다.
var MyCollectionSchema = new mongoose.Schema({
_id: String,
title: String
});
수행해 보십시오.for in에 대해 반복적으로item값에 액세스할 수 있는지 확인합니다.
for (var k in item) {
console.log(item[k]);
}
만약 작동한다면, 그것은 당신의 열쇠들이 약간의non-printable캐릭터 같은 거.
댓글로 말씀하신 것을 보니 왠지.item의 예입니다.String원시 포장지
예.
var s = new String('test');
typeof s; //object
s instanceof String; //true
이 이론을 검증하려면 다음을 시도합니다.
eval('(' + item + ')').title;
그것은 또한 가능할 수 있습니다.item다음을 갖는 객체입니다.toString사용자가 보는 것을 표시하는 방법.
편집: 이러한 문제를 빠르게 식별하려면 개체 속성의 대화형 목록을 표시하므로 대신 를 사용할 수 있습니다. 중단점만 사용하고 시계를 추가할 수도 있습니다.
사용하다findOne()대신에find().
그find()method는 값 배열을 반환합니다. 가능한 결과가 하나만 있더라도 항목 [0]을 사용하여 결과를 얻어야 합니다.
그findOne메소드는 개체를 하나 또는 하나도 반환하지 않습니다. 그러면 해당 속성에 문제 없이 액세스할 수 있습니다.
오래된 질문입니다만, 저도 이것에 문제가 있었기 때문에, 대답하겠습니다.
이 문제는 아마도 당신이 사용하고 있기 때문에 발생했을 것입니다.find()에 findOne()결국 문서 대신 문서 배열에 대한 메소드를 호출하여 단일 문서가 아닌 배열을 찾는 것입니다.용사를 합니다.findOne()개체에 정상적으로 액세스할 수 있습니다.
이와 같은 문제를 해결하는 더 나은 방법은 다음과 같습니다.doc.toObject()▁this.
doc.toObject({ getters: true })
기타 옵션은 다음과 같습니다.
getters:게터 및 게터를 적용합니다.virtuals:가상 게터 적용(게터 옵션을 재정의할 수 있음)minimize:개체 개체로 )는 다음과 같습니다.transform:전depopulate:채워진 경로를 원래 참조로 대체하여 채우기를 해제합니다(false로 대체).versionKey:버전 키를 포함할지 여부(true로 변경)
그래서 예를 들어 당신은 말할 수 있습니다.
Model.findOne().exec((err, doc) => {
if (!err) {
doc.toObject({ getters: true })
console.log('doc _id:', doc._id) // or title
}
})
그리고 이제 그것은 작동할 겁니다.
공백이나 재미있는 문자가 없습니다.' title' 러니그?개체/지도 정의에 식별자를 따옴표로 묶은 경우 정의할 수 있습니다.예:
var problem = {
' title': 'Foo',
'content': 'Bar'
};
그것은 원인이 될 수 있습니다.console.log(item)것과 하지만, 당신의 당이기는것유표게사만시지되하,를 유발합니다.undefined액스할때문에 할 때 합니다.title이전 공간이 없는 자산.
찾기' 메서드를 사용하면 문서 배열이 반환됩니다.제가 이걸 해봤는데 제목을 인쇄할 수 있었습니다.
for (var i = 0; i < doc.length; i++) {
console.log("iteration " + i);
console.log('ID:' + docs[i]._id);
console.log(docs[i].title);
}
모든 mongoose 혜택 없이 정보만 얻고자 하는 경우, 예를 들어 쿼리에서 .lean()을 사용할 수 있습니다.그러면 정보를 더 빨리 얻을 수 있고 직접 개체로 사용할 수 있습니다.
https://mongoosejs.com/docs/api.html#query_Query-lean
문서에 나와 있듯이 읽기 전용 시나리오가 가장 좋습니다.
개체를 초기화하고 있습니까?
function MyObject()
{
this.Title = "";
this.Content = "";
}
var myo1 = new MyObject();
초기화하지 않았거나 제목을 설정하지 않은 경우.정의되지 않을 것입니다.
쿼리를 때 쿼를만때다사용다니합을음들리▁t를 사용합니다..lean()
const order = await Order.findId("84578437").lean()
find객 체반환합니다열배는을▁find,와 같이 합니다. 요소에 액세스하려면 인덱싱을 사용하십시오.doc[0].title
언급URL : https://stackoverflow.com/questions/18710043/mongoose-mongodb-result-fields-appear-undefined-in-javascript
'programing' 카테고리의 다른 글
| 잠재적으로 위험한 요청입니다.클라이언트에서 양식 값이 탐지되었습니다. (0) | 2023.05.14 |
|---|---|
| Azure 서브스크립션 ID, AAD 테넌트 ID 및 AAD App Client ID가 비밀/PII로 간주됩니까? (0) | 2023.05.14 |
| 내부 사용자에게 TestFlight 초대 이메일이 전송되지 않음 (0) | 2023.05.14 |
| Python 사전 값 바꾸기 (0) | 2023.05.09 |
| Git 저장소에서 통계를 생성하는 중 (0) | 2023.05.09 |