簡體   English   中英

在插入新用戶之前嘗試檢查我的 mongodb 中是否存在用戶(以防止多個相同的電子郵件注冊)

[英]Trying to check if a user exist in my mongodb before inserting a new user (To prevent multiple same-email registration)

使用快遞。 我正在嘗試創建一個處理 POST 請求的 .js 文件,以在插入到我的 MongoDB 之前檢查用戶是否存在。 我建立了 2 個 MongoClient 連接來處理不同的情況。 首先是檢查用戶是否存在。 如果用戶不存在,那么它將轉到第二個連接。 我無法理解我做錯了什么

代碼是:`

router.post('/', function(req, res, next) {
  console.log("inside post method profile")
  ssn = req.session;
  ssn.firstName = req.body.fname;
  ssn.lastName = req.body.lname;
  ssn.userEmail = req.body.email;
  ssn.userPass = req.body.pass;
  let userExists = false;

  MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    let dbo = db.db("projectOne");
    let myInfoLog = {
      email: ssn.userEmail,
      pass: ssn.userPass
    };

    // TRYING TO COUNTERCHECK IF A USER ALREADY EXISTS
    dbo.collection("userInfo").findOne(myInfoLog, function(err, data) {
      if (data.email) {
        userExists = true;
        ssn.signUpError = "User email already exists";
        console.log("data returns an active email");
        db.close();
        res.redirect('/');
      }
    });
  });

  if (userExists == false) {
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      let dbo = db.db("projectOne");
      let myInfoLog = {
        email: ssn.userEmail,
        pass: ssn.userPass
      };

      let myInfo = {
        fname: ssn.firstName,
        lname: ssn.lastName,
        email: ssn.userEmail,
        pass: ssn.userPass
      };
      dbo.collection("userInfo").insertOne(myInfo, function(err, data) {
        if (err) throw err;
        console.log("collection inserted");
        // console.log(data.ops[0].fname);
        // console.log(data.ops[0].lname);
        // console.log(data.ops[0].email);
        // console.log(data.ops[0].pass);

        ssn.firstName = data.ops[0].fname;
        ssn.lastName = data.ops[0].lname;
        ssn.userEmail = data.ops[0].email;
        ssn.userPass = data.ops[0].pass;
        console.log("welcome! " + ssn.firstName + " " + ssn.lastName)

        db.close();
      });

      res.redirect('/profile');

    });
  }

});

module.exports = router;

我收到一個錯誤:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\express\lib\response.js:767:10)
at ServerResponse.location (C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\express\lib\response.js:884:15)
at ServerResponse.redirect (C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\express\lib\response.js:922:18)
at C:\Users\rousb\Desktop\Internship2020\P_01\routes\profile.js:47:15
at executeCallback (C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\mongodb\lib\operations\execute_operation.js:70:5)
at handleCallback (C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\mongodb\lib\utils.js:128:55)
at C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\mongodb\lib\operations\find_one.js:29:9
at C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\mongodb\lib\utils.js:731:5
at C:\Users\rousb\Desktop\Internship2020\P_01\node_modules\mongodb\lib\cursor.js:251:9 {

代碼:'ERR_HTTP_HEADERS_SENT'

您正在同時執行 2 個異步操作。 他們最終都試圖res.redirect('...'); 一旦用戶已被重定向,您就無法重定向。 您的if (userExists == false) {在您執行上述塊中的檢查之前執行。

你可以像這樣鏈接你的回調:

router.post('/', function(req, res, next) {
  ssn = req.session;
  ssn.firstName = req.body.fname;
  ssn.lastName = req.body.lname;
  ssn.userEmail = req.body.email;
  ssn.userPass = req.body.pass;

  MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    let dbo = db.db("projectOne");
    let myInfoLog = {
      email: ssn.userEmail // Don't include the password!
    };

    // Check if email exists
    dbo.collection("userInfo").findOne(myInfoLog, function(err, data) {
      if (data.email) {
        ssn.signUpError = "User email already exists";
        console.log("data returns an active email");
        db.close();
        res.redirect('/');
      } else {
        const myInfo = {
          fname: ssn.firstName,
          lname: ssn.lastName,
          email: ssn.userEmail,
          pass: ssn.userPass
        };
        // Insert user
        dbo.collection("userInfo").insertOne(myInfo, function(err, data) {
          if (err) throw err;
          console.log("collection inserted");

          ssn.firstName = data.ops[0].fname;
          ssn.lastName = data.ops[0].lname;
          ssn.userEmail = data.ops[0].email;
          ssn.userPass = data.ops[0].pass;
          console.log("welcome! " + ssn.firstName + " " + ssn.lastName);
          db.close();
          res.redirect('/profile');
        });
      }
    });
  });
});

module.exports = router;

您應該將if (userExists == false) {塊移動到第一次查找中。

dbo
  .collection("userInfo")
  .findOne(myInfoLog, function(err, data) {
    if (data.email) {
      // handle case where user already exists
    } else {
      // handle case where user doesn't exist yet
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM