我正在做一个实践项目,在这个项目中,我与Express、Mongo和Mongoose合作。我正在创建一个基本的CRUD结构,以便以后可以添加花哨的东西。
我的http://localhost:3000/campgrounds
路线显示了所有不同的露营地列在彼此下面。每个露营地都是一个a
链接,指向路线http://localhost:3000/campgrounds/123
上的详细信息页面。为了找到特定的露营地,我使用express函数findById()
。然而,当我进入该页面时,应用程序崩溃。
问题是req.params.id
返回两个值。当我转到正确的页面时,第一个值总是正确的,但随后它返回另一个null
值,这使Node程序崩溃。我不知道为什么它返回两个值,所以我希望你们中的一个可以帮助我!
目前,我在到http://localhost:3000/campgrounds/:id
的app.get
路由中包含了一个if
语句。这可以防止应用程序崩溃,但Chrome会继续无限加载页面。
我的索引
const express = require('express');
const path = require('path');
const mongoose = require('mongoose');
const Campground = require('./models/campground');
mongoose.connect('mongodb://localhost:27017/yelp-camp');
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", () => {
console.log("database connected");
});
const app = express();
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
// Setting the route to our homepage
app.get('/', (req, res) => {
res.render('home');
});
// Setting the route to the page that displays all campgrounds
app.get('/campgrounds', async (req, res) => {
// Getting all our different campgrounds
const campgrounds = await Campground.find({});
// Rendering the campgrounds index EJS template, and sending back the campgrounds found
res.render('campgrounds/index', { campgrounds });
});
// Setting the route to the details page of a single campgrounds
app.get('/campgrounds/:id', async (req, res) => {
const { id } = req.params;
console.log(id);
if (id !== 'null') {
try {
const campground = await Campground.findById(id);
res.render('campgrounds/show', { campground });
}
catch (error) {
console.log(error);
}
}
});
app.listen(3000, () => {
console.log('Serving on port 3000');
});
当我设置路线到一个露营地的详细信息页面时,问题就出现了。我目前只是强制输入一个值来检查findById()
是否正常工作,它确实正常工作。我的console.log返回了我已经说过的两个值。首先是正确的id,然后是null
值。
我的schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const CampgroundSchema = new Schema({
title: String,
price: String,
description: String,
location: String
});
module.exports = mongoose.model('Campground', CampgroundSchema);
EJS文件campgrounds/show
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Campground: <%= campground.title %></title>
</head>
<body>
<h1>Campground: <%= campground.title %></h1>
</body>
</html>
EJS文件campgrounds/index
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Campgrounds</title>
</head>
<body>
<h1>All campgrounds</h1>
<ul>
<!-- Looping over our campgrounds and creating a li for each -->
<% for(let campground of campgrounds) { %>
<li><a href="/campgrounds/<%= campground._id %>"><%= campground.title %></a></li>
<% } %>
</ul>
</body>
</html>
问题
为什么req.params.id返回两个值,而不是一个?这里只有一个id,为什么还要返回null
值呢?
先谢了。
1条答案
按热度按时间iyr7buue1#
发现问题…对于每个请求,2个HTTP请求被发送,因为我安装了一个坏的Chrome扩展。卸载了Chrome扩展程序,一切都正常工作!
我在一个隐蔽的环境中通过测试不同的变量设法解决了这个问题。在Chrome开发者工具的帮助下,我还看到,每次调用扩展程序后都会出现这个问题。也许这可以帮助别人有类似的问题!