mongoose 使用Node JS html在Mongodb数据库中发布空数据

wz8daaqr  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(150)

如何解决这个问题请帮助我

const express=require("express");
const app=express();
const bodyparser=require("body-parser");
const cors=require("cors");
const mongoose=require("mongoose");
const PORT=4000;
app.use(cors());
app.use(express.urlencoded({extended:false}));
app.use(express.json());
app.use(bodyparser.urlencoded({extended:true}));

const URL='mongodb+srv://username:[email protected]/UserDB';
 const userSchema=new mongoose.Schema({
    name:{
        type:String
    },
    password:{
        type:String
    }
 });
 const UserModel= mongoose.model("userData",userSchema);

app.get("/",(req,res)=>{
    res.send("hello ")
})
app.get("/reg",(req,res)=>{
    res.sendFile(__dirname+ "/./index.html")

})
app.post("/reg",async(req,res)=>{

    const newUser= new UserModel(req.body);
    await newUser.save();
   res.status(201).json({
        meg:"User created",
    })

});
mongoose.connect(URL)
try {
    console.log("Db is conected");
    
} catch (error) {
    console.log("Db is not conected");
    console.log(error);
    process.exit(1);
    
}

app.listen(PORT, ()=>{
    console.log(`Server is running http://localhost:${PORT}`)
});

个字符

输入输出

如何解决这个问题请帮助.如果你知道任何人如何slove请解释.分享您的代码请.我会尝试slove这个问题大约5days.but我canot slove这个问题.
enter image description hereenter image description hereenter image description here的一个字符串

af7jpaap

af7jpaap1#

看起来你的代码基本上是正确的,但是你可以做一些改进和检查来确保数据被正确地发送和接收:

**1. Body解析顺序:**您同时使用body-parser和express.json()来解析请求body,最好只使用express.json(),因为Express默认包含express.json()。

替换:

app.use(bodyparser.urlencoded({ extended: true }));

字符串
使用:

app.use(express.urlencoded({ extended: false }));


删除主体解析器导入及其用法。

**2.表单数据编码:**您连接数据库的try-catch块没有处理mongoose. connect返回的promise,您应该使用await关键字来正确处理。

替换:

mongoose.connect(URL);


使用:

await mongoose.connect(URL, { useNewUrlParser: true, useUnifiedTopology: true });


为了防止空数据被发送到MongoDB,您应该在保存数据之前添加验证检查。具体来说,您应该在尝试保存用户之前检查必填字段(在本例中,名称和密码)是否为空。
下面是您的app.post(“/reg”,redc(req,res)=> { route with validation check:

app.post("/reg", async (req, res) => {
const { name, password } = req.body;

// Check if required fields are provided
if (!name || !password) {
    return res.status(400).json({
        error: "Name and password are required fields.",
    });
}

// Check if name and password are not empty
if (name.trim() === "" || password.trim() === "") {
    return res.status(400).json({
        error: "Name and password cannot be empty.",
    });
}

const newUser = new UserModel({ name, password });

try {
    await newUser.save();
    return res.status(201).json({
        msg: "User created",
    });
} catch (error) {
    console.error("Error saving user:", error);
    return res.status(500).json({
        error: "Internal Server Error",
    });
}
});


此更新的代码执行以下操作:

  • 从req.body中删除名称和密码,以便于验证。
  • 检查是否提供了名称和密码。如果没有,则返回400 Bad Request响应。
  • 检查删除空格后的name和password是否为空字符串。如果为空,则返回400 Bad Request响应。
  • 如果所有检查都通过,它将创建一个新用户并尝试保存它。如果在保存过程中出现错误,它将返回500 Internal Server Error响应。
h4cxqtbf

h4cxqtbf2#

在您的<form>中删除enctype="multipart/form-data",只需:

<form action="/reg" method="POST">

字符串
这将把你的表单作为默认的application/x-www-form-urlencoded发送,这样你的express.urlencoded()函数就可以解析数据了。此时req.body将没有解析后的表单数据,所以你将无法向mongodb添加数据。
如果你想发送multipart/form-data来上传文件,那么你需要像multer这样的东西来解析数据。
你可以通过捕获错误并记录它们来改进你的代码。这将有助于你在将来进行调试。更新你的路由处理程序回调函数以使用try/catch,如下所示:

app.post("/reg",async(req,res)=>{
   try{
      const newUser= new UserModel(req.body);
      await newUser.save();
      res.status(201).json({
         message:"User created",
      })
   }catch(err){
      console.log(err);
      res.status(400).json({
         error: "Error on server",
      })
   }
});


最后,因为你已经创建了这样的模型:

const UserModel= mongoose.model("userData",userSchema);


Mongoose会寻找一个名为userdatas的集合,因为:
第一个参数是模型所属集合的单数名称。Mongoose会自动查找模型名称的复数小写版本
因此,如果您的集合名为users,则在创建模型时需要使用:用途:

const UserModel= mongoose.model("User",userSchema);

相关问题