NodeJS Express req.body 返回空字符串对象
NodeJS Express req.body returning empty string object
我对 nodeJS 和 express 还很陌生。我遇到了一个似乎无法解决的问题。
这个app.js
var express = require("express"),
app = express(),
mongoose = require("mongoose"),
bodyParser = require("body-parser");
mongoose.connect("mongodb://localhost/to_do_app", {useNewUrlParser: true, useUnifiedTopology: true});
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
// MODEL TODO
var todoSchema = new mongoose.Schema({
title: String,
created: {type: Date, default: Date.now}
});
var Todo = mongoose.model("Todo", todoSchema);
// Todo.create({
// title: "Database To-Do Entry",
// });
// ROUTES
app.get("/", function(req, res){
Todo.find({}, function(err, todos){
if(err){
console.log(err);
} else {
res.render("index", {todos: todos});
}
})
});
//CREATE ROUTE
app.post("/", function (req, res){
Todo.create(req.body.todo, function(err, newToDo){
if(err){
console.log(err);
} else {
console.log("added" + newToDo)
}
console.log(req.body.todo);
});
});
// START
app.listen(3000, function(){
console.log("Server has started!");
});
index.ejs
<%- include("partials/header") %>
<div class="container my-5">
<div class="row justify-content-center">
<div class="card bg-dark" style="width: 18rem;">
<div class="card-header text-white">
To-Do List
<a href="#collapseToDo" data-toggle="collapse"><i class="fas fa-plus ml-auto"></i></a>
</div>
<ul class="list-group list-group-flush">
<div class="collapse" id="collapseToDo">
<form action="/" method="POST">
<input class="list-group-item bg-light rounded-0" name="todo[title]" type="text" placeholder="Enter To-Do">
</form>
</div>
<% todos.forEach(function(todos){ %>
<li class="list-group-item"><%= todos.title %><span><i class="far fa-trash-alt"></i></span></li>
<% }) %>
</ul>
</div>
</div>
</div>
<%- include("partials/footer") %>
每次我 运行 这段代码,我都会尝试向数据库中添加一些新内容 req.body.todo returns {Title:""}。字符串完全是空的。我找不到解决这个问题的方法。提前致谢。
你的错误是这一行<input class="list-group-item bg-light rounded-0" name="todo[title]" type="text" placeholder="Enter To-Do">
输入字段的名称是 todo[title]
,但在您的服务器上您尝试使用 req.body.todo
获取待办事项标题。
我认为您需要更新您的 ejs 文件,将输入名称设置为 todo
:
<input class="list-group-item bg-light rounded-0" name="todo" type="text" placeholder="Enter To-Do">
我知道了 CREATE ROUTE
在创建待办事项后没有做任何事情。我认为,重定向到 /
路由会很好。
并且,如果你使用mongoose
,那么Todo.create
需要一个object而不是一个字符串,我客一个Todo只需要title
字段,最后是route将变成:
app.post("/", function (req, res){
Todo.create({title: req.body.todo}, function(err, newToDo){ // object Todo
if(err){
console.log(err); // return to error page like res. render('error', {erro})
} else {
console.log("added" + newToDo)
res.redirect('/') // reload the page
}
console.log(req.body.todo);
});
});
我对 nodeJS 和 express 还很陌生。我遇到了一个似乎无法解决的问题。
这个app.js
var express = require("express"),
app = express(),
mongoose = require("mongoose"),
bodyParser = require("body-parser");
mongoose.connect("mongodb://localhost/to_do_app", {useNewUrlParser: true, useUnifiedTopology: true});
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
// MODEL TODO
var todoSchema = new mongoose.Schema({
title: String,
created: {type: Date, default: Date.now}
});
var Todo = mongoose.model("Todo", todoSchema);
// Todo.create({
// title: "Database To-Do Entry",
// });
// ROUTES
app.get("/", function(req, res){
Todo.find({}, function(err, todos){
if(err){
console.log(err);
} else {
res.render("index", {todos: todos});
}
})
});
//CREATE ROUTE
app.post("/", function (req, res){
Todo.create(req.body.todo, function(err, newToDo){
if(err){
console.log(err);
} else {
console.log("added" + newToDo)
}
console.log(req.body.todo);
});
});
// START
app.listen(3000, function(){
console.log("Server has started!");
});
index.ejs
<%- include("partials/header") %>
<div class="container my-5">
<div class="row justify-content-center">
<div class="card bg-dark" style="width: 18rem;">
<div class="card-header text-white">
To-Do List
<a href="#collapseToDo" data-toggle="collapse"><i class="fas fa-plus ml-auto"></i></a>
</div>
<ul class="list-group list-group-flush">
<div class="collapse" id="collapseToDo">
<form action="/" method="POST">
<input class="list-group-item bg-light rounded-0" name="todo[title]" type="text" placeholder="Enter To-Do">
</form>
</div>
<% todos.forEach(function(todos){ %>
<li class="list-group-item"><%= todos.title %><span><i class="far fa-trash-alt"></i></span></li>
<% }) %>
</ul>
</div>
</div>
</div>
<%- include("partials/footer") %>
每次我 运行 这段代码,我都会尝试向数据库中添加一些新内容 req.body.todo returns {Title:""}。字符串完全是空的。我找不到解决这个问题的方法。提前致谢。
你的错误是这一行<input class="list-group-item bg-light rounded-0" name="todo[title]" type="text" placeholder="Enter To-Do">
输入字段的名称是 todo[title]
,但在您的服务器上您尝试使用 req.body.todo
获取待办事项标题。
我认为您需要更新您的 ejs 文件,将输入名称设置为 todo
:
<input class="list-group-item bg-light rounded-0" name="todo" type="text" placeholder="Enter To-Do">
我知道了 CREATE ROUTE
在创建待办事项后没有做任何事情。我认为,重定向到 /
路由会很好。
并且,如果你使用mongoose
,那么Todo.create
需要一个object而不是一个字符串,我客一个Todo只需要title
字段,最后是route将变成:
app.post("/", function (req, res){
Todo.create({title: req.body.todo}, function(err, newToDo){ // object Todo
if(err){
console.log(err); // return to error page like res. render('error', {erro})
} else {
console.log("added" + newToDo)
res.redirect('/') // reload the page
}
console.log(req.body.todo);
});
});