NodeJS 无法将app.post返回到不保存多个示例的用户模型

jxct1oxe  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(119)
app.post('/register', async function(req, res) {

  console.log(req.body.email)
  console.log(req.body.username)
  console.log(req.body.password)

  await userModel.findOne({ username: req.body.username }).then(
    (user)=>{
      if(user != null){
        res.send('exists');
        return;
      }
  }).catch((error) => { console.log(error) });

  await userModel.findOne({ email: req.body.email }).then(
    (user)=>{
      if(user != null){
        res.send('exists');
        return;
      }
  }).catch((error) => { console.log(error) });

  const userInstance = new userModel(
  {
    username: req.body.username,
    password : req.body.password,
    email: req.body.email,
    imagelink: "/images/blank",
    links: [],
    plan: 0
  });

  userInstance.save().then((savedUser) => {
        if(savedUser){ /*console.dir(savedUser, {depth:null});*/ res.send('success'); }
   }).catch((error) => {
       console.log(error);
       //res.send(400, "Bad Request");
   });

});

字符串
我有这个代码上面创建和保存用户到数据库,然而,当一个用户实际上exists,它应该returnres.send(),但它仍然保存示例到数据库,所以我得到同一个电子邮件的多个示例/用户名组合。如果一个用户存在,我如何返回整个函数,这样我就不会在DB中多次使用相同的电子邮件。return我似乎没有做我想做的事。
我也得到了这个错误的行,它有res.send("success")

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

kgsdhlau

kgsdhlau1#

最简单的方法是将unique约束添加到schema中的usernameemail属性。然后,当您尝试使用已存在的usernameemail创建新用户时,Mongoose将执行验证。您的schema看起来像这样:

const userSchema = new mongoose.Schema({
   username: {
      type: String,
      unique: true //< Adds a unique index
   },
   password: String,
   email: {
      type: String,
      unique: true //< Adds a unique index
   },
   imagelink: String,
   links: [String],
   plan: Number
});

字符串
然后在你的路由处理程序中,尝试创建一个新用户,如果一个用户已经存在,mongoose会抛出一个错误,就像这样:

app.post('/register', async function(req, res) {
   try{
      const userInstance = await userModel.create({
         username: req.body.username,
         password: req.body.password,
         email: req.body.email,
         imagelink: "/images/blank",
         links: [],
         plan: 0
      });
      return res.status(201).json({
         message: 'Successfully created.'
      });
   }catch(err){
      console.log(err);
      if(err.code === 11000){
         return res.status(400).json({
            message: 'User already exists.'
         });
      }
      return res.status(500).json({
         message: 'Error on server.'
      });
   }
})

备注err.code === 11000是mongoose抛出的重复键错误,如果来自req.bodyusernameemail已经存在于你的集合中。密码永远不应该以纯文本存储,你应该实现一个预保存钩子并对你的密码进行散列,但这是另一个问题。

相关问题