Nodejs新人求助,点击对应的连接请求后并不是输出相应的请求路径名

Nodejs新人求助,点击对应的连接请求后并不是输出相应的请求路径名

alt bug图

一个很原始的路由判断页面,判断了4个请求路径: ‘/’,’/insert’,’/update’,’/delete’ 分别点击相应的链接会在控制台输出点击请求的路径名. 但是有时候会出现一个情况,点击了对应的请求后不是立马输出请求路径,反而会出现其他路径的请求名,或者是上一次链接的请求路径名! 难道真的是因为 /favicon.ico 这个的原因么?


21 回复

根据你描述的情况,问题可能是由于 /favicon.ico 请求引起的。浏览器通常会自动发送对 favicon.ico 的请求,这可能会导致一些意外的行为。此外,还可能存在其他一些常见的问题,比如异步操作没有正确处理等。

示例代码

首先,我们来看一下一个简单的 Node.js 应用程序,使用 Express 框架来处理不同路径的请求:

const express = require('express');
const app = express();

// 设置静态文件目录,以便浏览器可以请求 favicon.ico
app.use(express.static('public'));

app.get('/', (req, res) => {
    console.log('/ 路径被访问');
    res.send('<a href="/">Home</a> <a href="/insert">Insert</a> <a href="/update">Update</a> <a href="/delete">Delete</a>');
});

app.get('/insert', (req, res) => {
    console.log('/insert 路径被访问');
    res.send('<a href="/">Home</a> <a href="/insert">Insert</a> <a href="/update">Update</a> <a href="/delete">Delete</a>');
});

app.get('/update', (req, res) => {
    console.log('/update 路径被访问');
    res.send('<a href="/">Home</a> <a href="/insert">Insert</a> <a href="/update">Update</a> <a href="/delete">Delete</a>');
});

app.get('/delete', (req, res) => {
    console.log('/delete 路径被访问');
    res.send('<a href="/">Home</a> <a href="/insert">Insert</a> <a href="/update">Update</a> <a href="/delete">Delete</a>');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 设置静态文件目录

    • 使用 app.use(express.static('public')) 来设置静态文件目录,这样浏览器可以请求 favicon.ico 文件。
    • 在项目根目录下创建一个名为 public 的文件夹,并将 favicon.ico 放入该文件夹中。
  2. 路由处理

    • 对于每个路径 (/, /insert, /update, /delete),定义一个路由处理器函数,该函数会在控制台上打印出当前路径,并返回一个包含链接的 HTML 页面。
  3. 监听端口

    • 使用 app.listen 方法启动服务器,并监听指定端口(默认为 3000)。

通过这种方式,你可以确保 /favicon.ico 请求不会干扰到其他路径的请求处理。如果仍然存在异常行为,可以检查是否有其他中间件或逻辑影响了请求处理。


点删除后控制台输出的是 /favicon.ico ,之后点首页输出了两次分别是 ‘/’ , ‘/delete’ .我有为 ‘/favicon.ico’ 做请求判断啊,这是为什么呢.

var http = require(‘http’), url = require(‘url’);

http.createServer(function(request,response){
     if(url.parse(request.url).pathname ==="/"){
    console.log(url.parse(request.url).pathname);
    
 }else if(url.parse(request.url).pathname ==="/insert"){
 
    console.log(url.parse(request.url).pathname);
    
 }else if(url.parse(request.url).pathname ==="/update"){
 
    console.log(url.parse(request.url).pathname);
    
 }else if(url.parse(request.url).pathname ==="/delete"){
 
    console.log(url.parse(request.url).pathname);
    
 }else{
 
    console.log(url.parse(request.url).pathname);
    
 }

}).listen(8888);

html输出代码省略了…

alt bug 再来一张… 这是为什么啊~ 页面请求最多本身+favicon这两个啊~

浏览器自动加的, Chrome 会加

继续请求帮助…

不太明白…这有什么问题…本来就应该如此… favicon 的原因楼上已经回答了 至于 / 因为你点首页的时候访问了一次啊…

话说,nodejs 是异步的.这种输出本来就可能会发生,不按照顺序来,如果你要按照顺序来要不用fs.sync,要不在callback里面调用.

不考虑 /favicon.ico 的请求,你的后台请求正常吗?

/favicon.ico 就是个图像请求,可忽略。

后台是指? 目前是没有后台,只是点击链接后反馈相应路径. 基本代码都在#2,除了html的输出. 问题还是在我点的链接是 ‘/delete’,控制台会输出 ‘/home’,当我点击’/home’的时候控制台会输出’/delete’ 或者接着输出 '/home’ 诡异的地方啊~

访问一次却有多次请求,而且请求的路径是不确定的…坑爹啊!

继续求助~

在chrome下用开发者工具看请求次数,也只请求了一个页面~但nodejs就愣是执行了两次…

在使用chrome+fiddler的情况下,这种情况消失了…消失了…!! ie下也没出现这情况!! 坑爹啊!

用 node-inspector 加断点调试一下。

或許該把你的code發出來, 這樣大家才知道怎麼幫你

app.js

var http = require('http'),
    url = require('url'),
    fs = require("fs");

http.createServer(function(req, res){ var pathname = url.parse(req.url).pathname; console.log(pathname);

fs.readFile("index.html", function(err, data) {
    res.writeHead(200, { "Content-Type": "text/html" });
    res.end(data);
});

}).listen(8888);

index.html

<a href="/index">index</a>
<a href="/insert">insert</a>
<a href="/update">update</a>
<a href="/delete">delete</a>

跳转的时候也访问了’/'了吧

点一个链接一般不会跳转2次吧. 而且有时候是点了 ‘/’ 后出现其他的路径…

code 在 #2 啊~

问题算是解决了. 我猜测原因是fiddle的全局代理用的端口是8888,而我的服务器监听端口也是8888造成的.

从你的描述来看,问题可能是由于多次请求或者浏览器自动请求 /favicon.ico 导致的。你可以通过检查请求路径来排除这种情况。

以下是一个简单的示例代码,展示如何处理基本的 HTTP 请求:

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
    // 解析请求路径
    const parsedUrl = url.parse(req.url);
    const pathname = parsedUrl.pathname;

    console.log(`Request for ${pathname} received.`);

    // 返回简单的响应
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`You requested: ${pathname}`);

    // 检查是否是 favicon 请求
    if (pathname === '/favicon.ico') {
        return;
    }

    switch (pathname) {
        case '/':
            console.log('/ route hit');
            break;
        case '/insert':
            console.log('/insert route hit');
            break;
        case '/update':
            console.log('/update route hit');
            break;
        case '/delete':
            console.log('/delete route hit');
            break;
        default:
            console.log('Other route hit');
    }
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释:

  1. 解析请求路径:使用 url.parse(req.url) 解析请求路径。
  2. 处理 favicon 请求:如果请求路径为 /favicon.ico,直接返回,避免处理无效请求。
  3. 处理不同的路由:使用 switch 语句处理不同的路由请求,并在控制台上输出相关信息。

确保你已经正确地解析了请求路径并排除了不必要的请求(如 /favicon.ico)。这样可以减少错误的请求路径输出。

回到顶部