如何处理中间件函数中的req参数

How to handle req parameters in Middleware function

我想在 expressjs 框架的中间件函数中处理请求参数。为了描述我的问题,我创建了非常小的工作示例。让我们考虑一下我想在路径中有一个语言参数,如果给定的值错误(不支持的语言),则将其值更改为默认值。假设我只支持 'en''fi' 语言并且我想设置 "lang" 参数到 'fi' 如果用户给出的不是 ['en', 'fi'].

为此我准备了一段代码:

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

// MIDDLEWARE FUNTION
function handleLang(req, res, next) {
    console.log("from handleLang I see params: "); console.log(req.params)
    var supportedLangs = ['en', 'fi']
    if (req.params.lang === undefined || (supportedLangs.indexOf(req.params.lang) == -1)) {
        console.log("so changing req.params.lang to default...")
        req.params.lang = "fi"
        console.log("before I leave handleLang I see req.params as: "); console.log(req.params)
    }
    return next()
}

app.use("/:lang*?", handleLang)

app.get('/:lang*?', function (req, res) {
    console.log('from app.get I see following params: '); console.log(req.params)
    res.send('index')
})

app.listen(4000, () => {
    console.log('Server started....')
})

我预计 handleLang 函数会将 lang 更改为默认值,我会在 get 函数中看到它。可惜我错了。

当我转到地址 http://localhost:4000/xx 时,我看到以下输出:

Server started....
from handleLang I see params:
{ '0': '', lang: 'xx' }
so changing req.params.lang to default...
before I leave handleLang I see req.params as:
{ '0': '', lang: 'fi' }
from app.get I see following params:
{ '0': '', lang: 'xx' }
from handleLang I see params:
{ '0': '', lang: 'favicon.ico' }
so changing req.params.lang to default...
before I leave handleLang I see req.params as:
{ '0': '', lang: 'fi' }
from app.get I see following params:
{ '0': '', lang: 'favicon.ico' }

我不知道为什么 req.params.lang 会以某种方式更改为 'favicon.ico' 并且我不明白为什么我会两次看到相同的消息。任何人都可以向我解释为什么会发生这种情况并描述应该如何正确完成吗?

一种方法是您可以像下面这样在中间件中设置语言:

`req.headers['language'] = 'fi';`

您以后可以像下面这样访问这个值:

console.log(req.headers['language'])

这是由您可能使用的浏览器引起的。

如果未指定,许多浏览器(例如 Chrome 和 Firefox)会自动尝试获取 favicon.ico 文件。这是保存您网站图标的文件。

Web 上的大多数站点都使用此文件名和位置(在根目录中),这导致大多数浏览器自动从那里获取文件,如果没有明确指定的话。我个人认为,这是大多数人使用的未定义标准。

实际情况是这样的:

  1. 你在浏览器地址栏输入http://localhost:4000/xx,它会跳转到你真正想要的请求。

  2. 您的浏览器想要显示您正在访问的网站的图标,并检查缓存。因为您没有网站图标,浏览器会尝试在新请求中获取图标。因为你没有明确设置网站图标的位置,浏览器会自动尝试从 http://localhost:4000/favion.ico 获取它,它被 express 解析为你的 lang 参数。

因此,您会看到您的实际请求 http://localhost:4000/xx 和浏览器发出的自动请求 http://localhost:4000/favicon.ico。这就是为什么最后一个请求的语言参数设置为 favicon.ico 的原因。