V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pangtianyu
V2EX  ›  Node.js

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

  •  
  •   pangtianyu · 2017-10-30 20:23:14 +08:00 · 3280 次点击
    这是一个创建于 2584 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好 请问怎样才能用 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 上面都写一遍这些么 还是说有什么更加聪明的姿势

    谢谢大家

    8 条回复    2017-10-30 21:40:03 +08:00
    crs0910
        1
    crs0910  
       2017-10-30 20:56:31 +08:00
    你的代码放错位置了吧。放在别的路由顶部。
    pangtianyu
        2
    pangtianyu  
    OP
       2017-10-30 21:10:59 +08:00
    @crs0910 #1 不好意思我不是很理解。。应该是放在哪里的。。我第一次搞这些东西。。
    lrz0lrz
        3
    lrz0lrz  
       2017-10-30 21:23:13 +08:00   ❤️ 1
    app.use 的先后顺序会有影响,把这个放在最前面
    crs0910
        4
    crs0910  
       2017-10-30 21:25:13 +08:00   ❤️ 1
    ```
    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
        5
    crs0910  
       2017-10-30 21:26:27 +08:00
    看看文档理解下,express 用一两次就很熟悉了,没几个 api
    imherer
        6
    imherer  
       2017-10-30 21:26:53 +08:00
    是要返回 lang 变量的值?还是 lang 变量对应语言的文本的值?
    pangtianyu
        7
    pangtianyu  
    OP
       2017-10-30 21:33:17 +08:00
    @lrz0lrz #3 @crs0910 #4 谢谢两位 我好像搞懂了

    @imherer #6 是返回 lang 对应语言的文本的 value
    pangtianyu
        8
    pangtianyu  
    OP
       2017-10-30 21:40:03 +08:00   ❤️ 1
    @crs0910 #4 我一开始看到在官方文档上面写着 app.use 里面 path 的 default 是 '/' 想着没有 specify path 的话只会在 root 有 request 的时候执行 结果发现我这个应该算是 middleware 是所有 request 都会执行的 😅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.