2017-10-27 1 views
0

저는 웹 개발에 익숙하며 java/android 배경에서 새로 왔습니다. mongoose save()에 관해서 다른 모든 질문을 읽었습니다. db에 저장하지 않았지만 여전히 db에 쓰기를 할 수는 없습니다.몽구스 저장 기능이 작동하지 않습니다. post ('save')가 호출되지 않고 오류가 발생하지 않습니다.

감사합니다.

나는 내 스키마를 정의하는 grocery.js를 작성했으며 데이터베이스에 쓰고 읽으려면 groceryQueries.js라는 또 다른 스크립트를 작성했습니다. 프리 후크 저장이 호출되지만 저장 포스트 훅은 호출되지 않습니다. 이것은 내가 명령을 사용한다 :

노드 groceryQueries.js 과일, 사과, appl.jpg를 삽입, 여기

0.46는 출력 :

(노드 : 14548) DeprecationWarning : 또는을 사용하는 경우 옵션을 대신 사용하십시오. open()은 몽구스> = 4.11.0에서 사용되지 않으며 openUri()을 사용하십시오.. http://mongoosejs.com/docs/connections.html#use-mongo-client 연결

PARAMS MongoDB를 위해 참조 : DeprecationWarning : 몽구스 : mpromise (몽구스의 기본 약속 라이브러리)는 지원되지 않습니다, 자신의 약속을 연결 : 과일, 사과, appl.jpg을 가 (14,548 노드) 0.46 대신 라이브러리 : http://mongoosejs.com/docs/promises.html

절약 사과

grocery.js :

,939,115,

groceryQueries.js :

var mongoose = require('mongoose'); 
 
var url = "mongodb://localhost:27017/deliveryservice"; 
 
mongoose.connect(url); 
 
const Grocery = require('../server/models/grocery'); 
 

 
var db = mongoose.connection; 
 
db.on('error',console.error.bind(console,'connection error')); 
 
db.once('open',function() { 
 
    console.log("connected to mongodb"); 
 
    doQueries(); 
 
}); 
 

 
function doQueries() { 
 
var groceryCollection = Grocery.COLLECTION_NAME();//"groceries"; 
 
var arg = process.argv[2]; 
 

 
if (arg == 'find' || 
 
    arg == 'insert') { 
 
     if (arg == 'find') { 
 
      var nameArg = process.argv[3]; 
 
      if (nameArg === undefined) { 
 
       var error = new Error('undefined name'); 
 
       throw error; 
 
      } 
 
      Grocery.find({name: nameArg},function(err,groceries) { 
 
       if (err) { 
 
        return console.error(err); 
 
       } 
 
       console.log("groceries: " + groceries); 
 
       db.close(); 
 
      }); 
 
     } else if (arg == 'insert') { 
 
      var paramsArg = process.argv[3]; 
 
      var throwError = false; 
 
      if (paramsArg === undefined) { 
 
       throwError = true; 
 
      } 
 
      console.log("params: "+paramsArg); 
 
      var parameters = paramsArg.split(","); 
 
      if (parameters.length != 4) { 
 
       throwError = true; 
 
      } 
 
      if (throwError) { 
 
       var error = new Error('undefined parameters <name>,<img>,<price>'); 
 
       throw error; 
 
      } 
 
      var newGrocery = new Grocery({category: parameters[0],name: parameters[1], img: parameters[2], price: parameters[3]}); 
 
      //console.log("before save: "+newGrocery.toString()); 
 
      newGrocery.save(function(err,newGrocery) { 
 
       if (err) { 
 
        throw err; 
 
       } 
 
       grocery.toString(); 
 
      }); 
 
      db.close(); 
 
     } 
 
} else { 
 
    console.log('help: find <name> | insert <category>,<name>,<img>,<price>') 
 
} 
 
}

답변

0

코드의 주된 문제는 저장이 발생하기 전에 db에 대한 연결을 닫는 것입니다. 몽구스의 모든 db 작업은 비동기이며 비동기 함수 호출은 이벤트 루프의 다음 틱에 대한 작업을 예약하기 만합니다. 해당 매개 변수가 실제로 저장 식료품이며 함수처럼 호출해서는 안,

newGrocery.save(function(err, newGrocery) { 
    if (err) { 
    throw err; 
    } 
    // grocery.toString(); <- typo here btw, param is called newGrocery 
}).then(function() { 
    db.close(); 
}); 

그리고 당신의 사후 저장 후크에서 next을 삭제 :

는 대신이 작업을 수행 할 수 있습니다.

mongoose.connect(url, { 
    useMongoClient: true, 
}); 

사람 :

grocerySchema.post('save', function() { 
    console.log('post saving '); 
}) 

보너스

은 ((오픈에 대해 경고를 제거)과 연결하려면)는 옵트 인 할 수있는 새 연결 로직이 사용되지되고 약속에 대한 경고를 없애다. 몽구스를 요구 한 후에 이것을 더한다.

// Use native promises 
mongoose.Promise = global.Promise 
1

save는 기다릴 필요가 약속을 반환에 대한 :

 newGrocery.save(function(err,newGrocery) { 
      if (err) { 
       console.log(err); 
       throw err; 
      } 
      newGrocery.toString(); // you had a typo here btw 
     }).then(function() { db.close();}); 

귀하의 공동 몽구스가 아무 것도 저장할 수 없기 전에 db.close()을 실행합니다.

관련 문제