programing

Mongoose 인스턴스 .save()가 작동하지 않습니다.

css3 2023. 6. 29. 20:20

Mongoose 인스턴스 .save()가 작동하지 않습니다.

Mongoose와 MongoDb에 문제가 있습니다.

그것은 매우 흥미롭습니다.Model.update과 업작및및save작동하지 않으며 콜백도 실행하지 않습니다.

Mongoose: 4.4.5 MongoDB: 3.0.8

고속도로

var mongoose = require('mongoose');
mongoose.connect("mongodb://127.0.0.1:27017/db");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(callback) {
    console.log("connection to db open")
});
var User = require("../models/user.js");

사용자 모델

var user = new Schema({
    uid: { type: Number, required: true, unique: true},
    hwid: { type: String, default:""},
    bol:{type:String,default:""}
});

엔포인트 업데이트

작업 버전:Model.update()

User.update({_id: id}, {
    uid: 5, 
}, function(err, numberAffected, rawResponse) {
    console.log(err);
})

버전이 작동하지 않아 해결해야 합니다: Object.save()

User.find({_id:id}, function(err,user){
    if(err){
         console.log(err);
    }
    if(!user){
         console.log("No user");
    }else{
        user.uid = 5;
        user.save(function(err,news){
            console.log("Tried to save...");
        });
    }
    console.log("At least worked");
})

콜백도 실행되지 않습니다.연결이 성공적으로 열립니다.콜백을 호출하지 않습니다.


  1. 사용하려고 했습니다.var User = connection.model('User', schema)작동하지 않았습니다.

저도 같은 문제가 있어요.제 문제는 DB 내부의 배열을 변경하는 것이었는데, 제가 .save()를 사용하려고 했을 때, 제가 아무것도 변경한 것을 이해하지 못했고, .save()가 작동하지 않았습니다..save()를 사용하기 전에 mark Modified()를 사용하면 문제가 해결됩니다.

문제가 있는 코드입니다. (작동하지 않습니다.)

club.members[index].name = new_name;
club.save();

이것이 제가 해결한 코드입니다: (작동)

club.members[index].name = new_name;
club.markModified('members');
club.save();

즐기세요!

사람들도 이 문제에 직면할 수 있기 때문에 저는 이 질문을 삭제하지 않을 것입니다.사실 문제는 MongoDb나 Mongoose와 관련이 없습니다.에 전화할 때.Object.save()책임 사슬은 다음과 같습니다.

  1. Schema.pre("저장")
  2. 데이터를 데이터베이스에 저장
  3. Schema.post messagesave")

그래서 차단을 하면.pre("save")그리고 전화하지 마next()문서를 저장할 수 없습니다.이건 제 사건이었어요, 저는 잊어버렸어요.next()를 걸어 했습니다. if if 문 시 3 간 오 찾 했 습 니 고 다 려 으 를 류

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
        next();
    }
}

this.trial == true다음 핸들러에 연결할 수 없습니다.

이와 같은 오류를 방지하기 위해 우리는 지점 커버리지를 처리해야 합니다. 기자들은 테스트되지 않은 코드를 보여줄 수 있습니다.당신의 문제도 이것과 관련이 있을 수 있습니다.문서를 저장해야 하는지 확인합니다.

고정 버전

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
    }
    next();
}

이상하게 들리네요..몇 시간 동안 이 문제를 해결하려고 노력해 왔습니다.너무 많은 스택 오버플로 게시물을 보았습니다.그것은 믿기 어려운 일이다.

그게 뭔지 알아요?저는 url 끝에 데이터베이스를 지정하지 않았습니다.

그래서 대신에

"mongodb://127.0.0.1:27017/test"

나는 가지고 있었습니다

"mongodb://127.0.0.1:27017

저는 이 일로 하루 종일을 허비했습니다.저는 정말로 제게 어떤 종류의 실수가 주어졌으면 좋겠습니다.레코드를 저장하면 항상 확인이 반환됩니다.그리고 데이터베이스 로그에서, 저는 정상적으로 연결하고 있었습니다.하지만 저는 정말 세부사항을 살펴볼 필요가 있었습니다.네, 몽고 인스턴스에는 연결되어 있었지만 데이터베이스 자체에는 연결되어 있지 않았습니다. 윽!

폴이 말한 것처럼.대부분의 경우 Mongoose 개체가 아닌 'req.user' 개체에 대한 저장을 호출합니다.다음과 같은 작업을 수행하고 있는지 확인합니다.

//I am using your 'user' schema
var userModel = mongoose.model('User', user);
var User = mongoose.model('User');
var newUser = new User(req.user);
newUser.save(function(error, user){
   //your code
}

혹시 다른 사람에게 이런 일이 생길까 봐요.

mongodb 인스턴스에 대한 연결이 열려 있지 않은 경우에도 이 문제가 발생할 수 있습니다.출력에서 적절한 연결 피드백을 확인합니다.

[initandlisten] 127.0.0.1:40448 #1에서 허용된 연결(1개 연결이 현재 열려 있음)

같은 문제를 접했는데 알고 보니instance.save()약속을 반환합니다.그러니 당신이 해야 할 일은 약속을 처리하는 것뿐입니다.사용.async/await-

await instance.save()

modername.save()가 더 이상 콜백을 수락하지 않습니다. 이제 약속을 사용하여 이 문제를 해결할 수 있습니다.

newData.save().then(function(err) {
  if (!err) {
    res.send("Successfully Added to th DataBase.");
  } else {
    res.send(err);
  }
});

지금은 if other 문을 save()로 사용해도 작동하지 않습니다.이제 트라이 캐치 문을 사용하여 해결할 수 있을 것 같습니다.

user.save().then(function (err) {
    try {
      res.render("User created succesfully");
    } catch (err) {
      console.log(err);
    }
  });

나와 같은 실수를 하는 사람에게..매우 짧은 시간에 .save()를 두 번 호출하면 됩니다.마지막 호출이 삭제됩니다.내 문제는 이것이었습니다.

//module usersave(userData)
{
  await userData.save()
}
//module A
{...todos
  moduleB(userData)
  ...some todos that doesn't take much time.
  await usersave(userData) //second call
}
//module B(userData)
{
 ...todos;
 await usersave(userData) // first call
}

=> Object.save()는 모듈 B에서 호출되었고, 즉시 모듈 A에서 다시 호출되었습니다. (Save 모듈을 만들든 Object.save()라고 직접 부르든 상관없습니다.) 이러한 종류의 콜 스택은 오류를 발생시키지 않으며 두 모듈 모두에서 정상적인 성공을 반환합니다.그러나 mongodb가 실제로 변경 사항을 반영하기 전에 두 번째 호출이 발생하므로 나중의 호출은 취소됩니다.문제는 오류를 감지할 수 없도록 실제로 저장된 것처럼 반환된다는 것입니다.

해결책: 그냥 기다려주세요.새 약속(r=>setTimeout(r,2000)을 기다립니다.

언급URL : https://stackoverflow.com/questions/35733647/mongoose-instance-save-not-working