首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Node.js
Express
PPA for Ubuntu
ppa:chris-lea/node.js
V2EX  ›  Node.js

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

  •  
  •   pangtianyu · 208 天前 · 908 次点击
    这是一个创建于 208 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好 请问怎样才能用 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
        1
    crs0910   208 天前
    你的代码放错位置了吧。放在别的路由顶部。
        2
    pangtianyu   208 天前
    @crs0910 #1 不好意思我不是很理解。。应该是放在哪里的。。我第一次搞这些东西。。
        3
    lrz0lrz   208 天前   ♥ 1
    app.use 的先后顺序会有影响,把这个放在最前面
        4
    crs0910   208 天前   ♥ 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()
    })
    ```
        5
    crs0910   208 天前
    看看文档理解下,express 用一两次就很熟悉了,没几个 api
        6
    imherer   208 天前
    是要返回 lang 变量的值?还是 lang 变量对应语言的文本的值?
        7
    pangtianyu   208 天前
    @lrz0lrz #3 @crs0910 #4 谢谢两位 我好像搞懂了

    @imherer #6 是返回 lang 对应语言的文本的 value
        8
    pangtianyu   208 天前   ♥ 1
    @crs0910 #4 我一开始看到在官方文档上面写着 app.use 里面 path 的 default 是 '/' 想着没有 specify path 的话只会在 root 有 request 的时候执行 结果发现我这个应该算是 middleware 是所有 request 都会执行的 😅
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1704 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 16ms · UTC 08:03 · PVG 16:03 · LAX 01:03 · JFK 04:03
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1