2014-03-19 1 views
1

그냥 멍청한 놈 문제 :Node.js를, 고속 및 몽구스, 정의되지 않은 데이터

내가 그 컬렉션에 관련 파일을 삭제 재산 "커버"를 사용하기 위해 노력하고있어,하지만 문제는 그것이로 표시한다는 것입니다 "undefined". 누구든지 이런 문제가 있었나요 ?? 감사 !!!

여기 내 로그입니다 :

FULL 결과 - {__v : 0, _id : 5329a730e4b6306a08297318,

기업 'ASD',

커버 '44f4a87035bd22c1995dcf0ab8af05b0'

설명 : 'asd',

종류 : 'ASD',

이름 : 'ASD'}

결과 커버 - 정의되지 않은 여기

내 코드입니다 :

exports.delete = function(req,res){ 

if(!req.session.authorized){ 
    res.json(403,{message:'YOU MUST BE LOGGED IN'}); 
    return; 
} 


Product.find({_id:req.params.id}, function(err,result){ 

    if (err){ 
     res.json(401, {message: err}); 

    }else{ 
     console.log("FULL RESULT - " + result); 
     console.log("RESULT COVER - " + result.cover); 

     var prodCoverName = result.cover; 

     if (prodCoverName){ 

      fs.exists('public/productAssets/'+ prodCoverName, function (exists) { 
       console.log('EXIST - public/productAssets/'+ prodCoverName); 
       fs.unlink('public/productAssets/'+ prodCoverName, function (err) { 

        if (err) throw err; 
        console.log('DELETED AT public/productAssets/'+ prodCoverName); 

       }); 

      }); 

     } 

    } 

}); 

Product.findOneAndRemove({_id:req.params.id}, function(err,result){ 

    if (err) res.json(401, {message: err}); 
    else res.json(200, {message: result}); 

}); 

};

답변

2

나는 몽구스의 전문가가 아니지만, 내 생각 Product.find 기능, 대신 하나의 문서로, 문서의 배열과 콜백의 호출, 그래서 당신은 다음과 같이 코드를 변경해야한다는 것입니다 :

Product.find({_id:req.params.id}, function(err, results){ 
    var result = results[0]; // either one result or nothing, because id is unique and we want the first result only. 
(빠른 첫 번째 결과이 하나의 콜백을)

또는 대신 findOne를 사용

Product.findOne({_id:req.params.id}, function(err, result){ 

또는 findById 사용 (짧은을 빠르게) :

Product.findById(req.params.id, function(err, result){ 

지금 내 경우 전체 결과가 왜 개체인지 물을 수 있습니다. 여기에 자바 스크립트에서 일어나는 일이 있습니다 :

여기에 console.log("FULL RESULT - " + result)이 있습니다. 여기에 문자열을 기록하고 문자열과 배열 사이에 문자열 연결 작업이 있습니다. 문자열이 아닌 문자열을 연결하려고하면 JavaScript가 문자열로 강제 변환하려고하므로 undefined/null이 아닌 경우 .toString 메서드를 호출합니다. .toString 배열의 메소드는 실제로 return this.join(',')입니다. join 메서드는 문자열 연결입니다. 배열은 문서를 포함하므로 javascript는 문서를 문자열로 변환하려고 시도합니다 (실제로는 객체 임). document.toString()을 호출합니다. 이것은 몽구스에 의해 구현되어 객체 프라퍼티를 반환하는데, 이는 util.inpsect(document);과 비슷해야합니다. 이 사건의 또 다른 예는 result is 1'result is ' + [1]에서 얻는 것입니다.

이 문제를 방지하려면 문자열로 오브젝트를 연결하는 것을 피하십시오. console.log('result is ' + object) 대신 console.log(object) 또는 console('result is', object)을 사용해보세요.

업데이트 : 난 그냥 당신은 또한 당신이 발견을 호출하는 동시에 findOneAndRemove을 요구하고 실현

,이 경쟁 조건이다. .findOneAndRemove이 이미 완료되었을 수 있으므로 .find 호출에서 아무 것도 찾지 못할 수도 있습니다. 이로 인해 더 많은 문제가 발생할 수 있습니다.

+0

나는 Product.findById (req.params.id, function (err, result) {당신이 말했듯이 ... 지금은 완벽하게 작동하고 있습니다 ... 나는 한 번만 호출하려고 노력할 것입니다. 미래의 문제를 피하기 위해서 .. 감사합니다. 정말 고마워요! 정말 고맙습니다! XD – rihurla

+1

환영합니다. 앞으로 문자열이 객체와 연결되지 않도록 노력하십시오.이 혼란이 다시 일어나지 않을 것입니다 .. –

+0

확실한 .. . 감사 !! – rihurla

관련 문제