我正在做一个浏览器中的todolist从Angela Yu的Web开发训练营课程。我的问题是,当我尝试从浏览器(localhost:3000
)启动Web应用程序时,我得到错误:
TypeError: Cannot read properties of undefined (reading 'length')
我的代码是:
//jshint esversion:6
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const app = express();
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));
mongoose.connect("mongodb://127.0.0.1:27017/todolistDB",
{
useUnifiedTopology: true,
useNewUrlParser: true,
serverSelectionTimeoutMS: 5000
}).catch(err => console.log(err.reason));
const itemsSchema = {
name: String
};
const Item = mongoose.model("Item", itemsSchema);
const item1 = new Item({
name: "Welcome to your todolist!"
});
const item2 = new Item({
name: "Hit the + button to add a new item."
});
const item3 = new Item({
name: "<-- Hit this to delete an item."
});
const defaultItems = [item1, item2, item3];
app.get("/", function(req, res) {
Item.find({}).then(function(err, foundItems){
if(foundItems.length === 0) {
Item.insertMany(defaultItems).then(function(err) {
if(err) {
console.log(err);
} else {
console.log("Successfully saved default items to DB!");
console.log(defautItems);
}
});
res.redirect("/");
}
else {
res.render("list", {listTitle: "Today", newListItems: foundItems});
console.log(foundItems);
}
});
});
app.post("/", function(req, res){
const itemName = req.body.newItem;
const item = new Item({[enter image description here](https://i.stack.imgur.com/C2viu.png)
name: itemName
});
item.save();
res.redirect("/");
});
app.get("/work", function(req,res){
res.render("list", {listTitle: "Work List", newListItems: workItems});
});
app.get("/about", function(req, res){
res.render("about");
});
app.listen(3000, function() {
console.log("Server started on port 3000.");
});
The error here
这个错误指向的是 foundItems 数组,奇怪的是它没有定义。该数组的元素存储在MongoDB数据库中,并且必须显示在Web应用程序todolist中。但这并不是因为提到的错误而发生的。如果 foundItems 数组没有任何项(其长度等于零),则当Web应用程序加载到浏览器中时,defaultItems 数组的项将自动添加到列表中。由于“foundItems”数组未定义,应用程序无法执行语句foundItems.length === 0,这将导致错误发生。最后,我提到了这样一个事实,即到MongoDB服务器的连接是功能性的,并且我可以在数据库中存储(在 app.get 方法之外)“defaultItems”数组的项。
我怀着极大的兴趣等待你的答复!
4条答案
按热度按时间hfsqlsce1#
您可能在
app.get("/", function(req, res)
函数上收到Mongoose的另一个错误。如果你稍微修改一下代码,你就会看到真实的的错误。因此,将函数app.get("/", function(req, res)
替换为:ar7v8xwq2#
所以有几个建议:
POST '/items'
)并检索所有项目(GET '/items'
),如[RESTful API实践][2]中所述。res.status(200)
;对于成功的项目创建,使用res.status(201)
;对于错误的请求,使用res.status(400)
。这些结束请求。我的工作版本在这里:https://replit.com/join/ygazhrwuqj-zwiqler94
[1]:https://mongoosejs.com/docs/index.html#:~:text= For%20brevity%2C%20let%27s,Kitten%27%2C%20kittySchema)%3B [2]:https://restfulapi.net/resource-naming/
ix0qys7i3#
这是因为
foundItems
可能不会一直有数据。您可以添加检查以查看是否定义了foundItems。在访问长度之前,使用此检查更改
if
条件。hgc7kmma4#
我的list.ejs文件:
我的新的真实的错误(在list.ejs文件中):
新的list.ejs文件代码:
现在整个代码工作得很好!浏览器中的Web应用程序正在正确加载!谢谢大家的帮助和建议!