Bagaimana untuk memecahkan rantaian janji semasa memasukkan pangkalan data jika data sudah wujud dalam pangkalan data?
P粉725827686
P粉725827686 2023-08-17 23:08:43
0
1
419
<p>Saya menggunakan mongoose untuk mencipta entri ahli baharu dalam pangkalan data selepas menyemak sama ada ahli itu sudah wujud dalam pangkalan data. Saya perlu mengembalikan respons jika ahli sudah wujud, jika tidak teruskan memasukkan ahli baharu. Berikut ialah kodnya: </p> <pre class="brush:php;toolbar:false;">createNewMember = (req, res, next) => Member.findOne({email: email}).exec() .then((ahli) => { if(ahli == null || members.length==0) { //Buat objek ahli baharu return newMember.save() // 1 --> } lain { res.status(409).json({message: "Ahli sudah wujud"}) // 2 --> } }) .then((hasil) => { if(res.statusCode === 409) return res; // 3 --> return res.status(201).json({message: "Ahli telah dibuat"}); // 4 --> }) .catch(err => { // Kendalikan ralat dan kembalikan respons ralat })</pre> <p>Apa yang saya mahu ialah jika proses mencapai titik 2, rantai janji terputus, tetapi blok kedua kemudian masih dipanggil. Titik 3 ialah semakan yang saya tambah untuk menghalang blok kedua kemudian daripada dilaksanakan, tetapi saya tidak fikir ini adalah cara terbaik untuk mengendalikannya. Saya percaya ini adalah senario biasa, adakah terdapat cara yang lebih baik? </p>
P粉725827686
P粉725827686

membalas semua(1)
P粉316110779

Tiada cara untuk memecahkan rantai janji kecuali membuang kesilapan anda sendiri dan melompat ke blok tangkapan. Walau bagaimanapun, anda tidak mahu menggunakan ralat seperti itu, kerana situasi itu sendiri bukan ralat, tetapi hanya situasi logik tertentu (ahli sudah wujud). Saya syorkan memikirkan .then() anda sebagai lapisan kek dengan kebimbangan yang berbeza, seperti ini:

Member.findOne({email: email}).exec()

    // DB layer
    .then((members) => {

         // 如果成员不存在,则开始保存并返回promise
         if(members == null || members.length==0) {
              // 创建newMember对象
              return newMember.save()   // 1 --> 返回promise
         } 

         // 如果成员存在,则返回undefined
         else {
             return;
         }
     })

     // Response Layer
     .then((newMember) => {
         let statusCode;
         let message;

         // 在.save()成功时,promise解析为新成员
         if(newMember) {
           statusCode = 201;
           message = "成员已创建";
         }

         // 如果我们在第一个.then()中返回了undefined,我们会到达这里
         else {
           statusCode = 409;
           message = "成员已存在";
         }

         return res.status(statusCode).json({message});
     })
     .catch(err => {
          // 处理错误并返回错误响应
     })
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan