一个关于用 Express.js 检测浏览器语言并返回正确文本的问题

2017-10-30 20:23:14 +08:00
 pangtianyu

大家好 请问怎样才能用 Express.js 达到以下效果:

Client 访问一个网站任意页面后:
    如果 cookie 已经有保存过偏好语言 比如说 en
        那么 Server 就返回英语的文本
    不然就
        检测浏览器语言 比如说检测到 ja 存入 cookie 返回日语文本

我现在做到这样:

var lang = null;
app.use(function(req, res, next) {
    lang = req.cookies.lang;
    if (!lang) {
        lang = req.acceptsLanguages('en', 'zh-cn', 'zh-hk', 'zh-sg', 'zh-tw');
        switch (lang) {
        case 'zh-cn' || 'zh-sg':
            lang = 'zh-Hans';
            break;
        case 'zh-hk' || 'zh-tw':
            lang = 'zh-Hant';
            break;
        default:
            lang = 'en';
        }
        res.cookie('lang', lang, {path: '/', httpOnly: true});
    }
    next();
});

问题是这个 function 好像只是作用在 '/' 上面 难道我要在每一个 url 的 router 上面都写一遍这些么 还是说有什么更加聪明的姿势

谢谢大家

3200 次点击
所在节点    Node.js
8 条回复
crs0910
2017-10-30 20:56:31 +08:00
你的代码放错位置了吧。放在别的路由顶部。
pangtianyu
2017-10-30 21:10:59 +08:00
@crs0910 #1 不好意思我不是很理解。。应该是放在哪里的。。我第一次搞这些东西。。
lrz0lrz
2017-10-30 21:23:13 +08:00
app.use 的先后顺序会有影响,把这个放在最前面
crs0910
2017-10-30 21:25:13 +08:00
```
var app = express()

// 没有挂载路径的中间件,应用的每个请求都会执行该中间件
app.use(function (req, res, next) {
console.log('我放在最前面,先过我这里。'))
next()
})

// 挂载至 /xxx 的中间件
app.use('/xxx', function (req, res, next) {
console.log('我是路由 xxx')
next()
})
```
crs0910
2017-10-30 21:26:27 +08:00
看看文档理解下,express 用一两次就很熟悉了,没几个 api
imherer
2017-10-30 21:26:53 +08:00
是要返回 lang 变量的值?还是 lang 变量对应语言的文本的值?
pangtianyu
2017-10-30 21:33:17 +08:00
@lrz0lrz #3 @crs0910 #4 谢谢两位 我好像搞懂了

@imherer #6 是返回 lang 对应语言的文本的 value
pangtianyu
2017-10-30 21:40:03 +08:00
@crs0910 #4 我一开始看到在官方文档上面写着 app.use 里面 path 的 default 是 '/' 想着没有 specify path 的话只会在 root 有 request 的时候执行 结果发现我这个应该算是 middleware 是所有 request 都会执行的 😅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/402048

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX