首页 > 解决方案 > Expressjs - 同一 URL 上的重复 GET 请求(一种类型的文档,一种类型的文本/html)

问题描述

我目前正在使用 nodejs 和 express 来尝试添加一个中间件,为 Internet Explorer 用户呈现登录页面。我的问题是,每当我加载它时,浏览器似乎都会向主页发出重复的 GET 请求。

以下是正在发生的事情的概述:

应用程序.js

var routes = require('./routes.js');

var express = require('express'),
    helmet = require('helmet'),
    handlebars = require('express-handlebars'),
    cors = require('cors'),
    cookieParser = require('cookie-parser');

//...

var ieRedirect = function(req, res, next) {
    console.log(req.method, req.path);
    if(req.headers['user-agent'].indexOf("MSIE") >= 0){
        res.render('IE-landing-page', {layout: 'default'});
    }   
    else{
        next();
    }   
};

app.use(express.static('./public', { extensions: ['html', 'htm'] }))
    .use(helmet({contentSecurityPolicy: false,}))
    .use(cors())
    .use(cookieParser())
    .use(ieRedirect)
    .use(routes);

app.listen(config.app.port);

路由.js

var express = require('express'),
    router = express.Router();

var users = require('./routes/users.js'),
    notFound = require('./routes/404.js');

//...

router.get('/', users.home);

//...

router.get('*', notFound.error404);

module.exports = router;

用户.js

module.exports = {
    home: function(req, res){
        //...
        //ends with:
        return res.render('home', {layout: 'default', user: userInfo});
    }
},
//...

据我了解,我已将我的应用程序配置为使用中间件.use(ieRedirect),当收到请求时,应检查 IE 用户代理,否则将其发送到路由器。路由器文件注册路由并使用.get(...). 但是,我的中间件中的行console.log(req.method, req.path);正在记录:

GET /
GET /

每当加载主页时。为什么会出现第二个请求?

查看 chrome 控制台网络选项卡,第一个请求是对/URL、状态 200 并键入“文档”。第二个请求稍后发生,再次请求,/但这次是“text/html”类型。

由于路径只是/它显然不是网站图标的问题(并且注释掉网站图标并不能阻止问题的发生)。

如何防止发出第二个请求?

标签: node.jsexpress

解决方案


事实证明,这个问题根本不在于 express 或后端。在我的一个车把模板中,我有以下占位符用于将由 API 填充的图像:

<img src="#" alt="">

# src 导致浏览器查找/#附加请求的来源。删除 src 标签完全解决了这个问题。

不敢相信这是一件令人头疼的事情。希望有同样问题的其他人能找到这个。


推荐阅读