如何处理中间件功能中的req参数

时间:2017-12-30 14:21:53

标签: node.js express middleware

我想在expressjs框架中处理中间件函数中的请求参数。为了描述我的问题,我创建了一个很小的工作示例让我们考虑我想在路径中有一个语言参数,如果给定的值错误(不支持的语言),则将其值更改为默认值。我们假设我只支持' ' 语言,我想设置 " lang" 参数' fi' 如果用户提供的除 [' en',&# 39;网络连接'。]

为此,我准备了以下代码:

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' 而且我不明白为什么我会两次看到相同的消息。任何人都可以解释为什么会发生这种情况并描述它应该如何正确完成?

2 个答案:

答案 0 :(得分:1)

一种方法是可以在中间件中设置语言,如下所示:

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

您可以稍后访问此值,如下所示:

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

答案 1 :(得分:1)

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

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

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

实际发生的是:

  1. 您将http://localhost:4000/xx输入浏览器地址栏,这会导致您实际需要的请求。

  2. 您的浏览器希望显示您正在访问的站点的图标,并检查其缓存。由于您没有网站图标,浏览器会尝试在新请求中获取图标。因为您没有明确设置网站图标的位置,浏览器会自动尝试从http://localhost:4000/favion.ico获取它,并通过快递解析为lang参数。

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