接收 2 个 HTTP 请求,其中仅发送了 1 个

Receiving 2 HTTP request where only 1 was send

提问人:Niels Koop 提问时间:9/6/2023 最后编辑:Niels Koop 更新时间:9/7/2023 访问量:50

问:

我正在做一个实践项目,其中我与 Express、Mongo 和 Mongoose 合作。我正在创建一个基本的 CRUD 结构,以便以后可以添加花哨的东西。

我的路线显示了彼此下方列出的所有不同露营地。每个露营地都是一个链接,指向路线上的详细信息页面。要找到特定的露营地,我正在使用快捷功能。但是,当我进入该页面时,应用程序崩溃了。http://localhost:3000/campgroundsahttp://localhost:3000/campgrounds/123findById()

问题是返回 2 个值。当我转到正确的页面时,第一个值始终是正确的,但随后它返回另一个值,该值使 Node 程序崩溃。我不知道为什么它返回 2 个值,所以我希望你们中的一个人可以帮助我!req.params.idnull

目前,我在 .这样可以防止应用程序崩溃,但 chrome 会继续无限加载页面。ifapp.gethttp://localhost:3000/campgrounds/:id

我的索引文件

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');
});

当我设置通往单个露营地详细信息页面的路线时,出现问题。我目前只是强制输入一个值来检查它是否正常运行,确实如此。我的控制台 .log 返回 2 个值,就像我已经说过的那样。首先是正确的 ID,然后是一个值。findById()null

我的架构

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 返回 2 个值,而不仅仅是一个值?只有 1 个 id,那么为什么它也应该返回一个值呢?null

提前致谢。

节点 .js mongoDB Express 猫鼬

评论

0赞 hoangdv 9/6/2023
提供内容campgrounds/show.ejs
0赞 Niels Koop 9/6/2023
嗨,@hoangdv,EJS 文件在我帖子的底部。我发现返回 2 个值是正常行为,所以我的代码中一定有其他问题。req.params.id
0赞 Niels Koop 9/6/2023
实际上,返回 2 个值不是正常行为。伙计,我现在很困惑,哈哈。req.params.id
0赞 Phil 9/6/2023
听起来你有一些东西对你的露营地路线提出了多个请求。我会看的第一个地方是在您的视图文件中(除非您没有显示更多内容)campgrounds/indexcampgrounds/show
0赞 Niels Koop 9/6/2023
嗨,菲尔,谢谢你的回答。我已将该文件包含在我的原始帖子中。没有更改,与主文件中完全相同。我有没有可能有 2 个服务器实例在运行,这就是发出多个请求的原因?如果是,有没有办法验证这个问题?campgrounds/indexcampgrounds/showreq.params.id

答:

-1赞 Niels Koop 9/7/2023 #1

发现问题...对于每个请求,由于我安装了错误的 Chrome 扩展程序,因此发送了 2 个 HTTP 请求。卸载了Chrome扩展程序,一切正常!

我设法通过在僻静的环境中测试不同的变量来解决这个问题。我还看到,在 Chrome 开发人员工具的帮助下,每次调用扩展程序后都会出现问题。也许这可以帮助其他人解决类似的问题!