Nodejs新人求助,点击对应的连接请求后并不是输出相应的请求路径名
Nodejs新人求助,点击对应的连接请求后并不是输出相应的请求路径名
一个很原始的路由判断页面,判断了4个请求路径: ‘/’,’/insert’,’/update’,’/delete’ 分别点击相应的链接会在控制台输出点击请求的路径名. 但是有时候会出现一个情况,点击了对应的请求后不是立马输出请求路径,反而会出现其他路径的请求名,或者是上一次链接的请求路径名! 难道真的是因为 /favicon.ico 这个的原因么?
根据你描述的情况,问题可能是由于 /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}`);
});
解释
-
设置静态文件目录:
- 使用
app.use(express.static('public'))
来设置静态文件目录,这样浏览器可以请求favicon.ico
文件。 - 在项目根目录下创建一个名为
public
的文件夹,并将favicon.ico
放入该文件夹中。
- 使用
-
路由处理:
- 对于每个路径 (
/
,/insert
,/update
,/delete
),定义一个路由处理器函数,该函数会在控制台上打印出当前路径,并返回一个包含链接的 HTML 页面。
- 对于每个路径 (
-
监听端口:
- 使用
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输出代码省略了…
再来一张…
这是为什么啊~
页面请求最多本身+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');
});
解释:
- 解析请求路径:使用
url.parse(req.url)
解析请求路径。 - 处理 favicon 请求:如果请求路径为
/favicon.ico
,直接返回,避免处理无效请求。 - 处理不同的路由:使用
switch
语句处理不同的路由请求,并在控制台上输出相关信息。
确保你已经正确地解析了请求路径并排除了不必要的请求(如 /favicon.ico
)。这样可以减少错误的请求路径输出。