求助,关于登录后显示用户名问题,我想请教一下
发布于 10 年前 作者 tofrookie 5104 次浏览 最后一次编辑是 8 年前 来自 问答

我现在登录后,用户信息保存在session里, 然后每个页面都要显示用户名,这块区域是在页面最上方的, 我要怎么做合理呢,还是每个页面都从session里往前端传

18 回复

前端用AJAX呗,不要跳转URL。 如果你要SEO,那就每个页面渲染的时候往前端传就是了

@MiguelValentine 不太理解啊,这跟ajax什么关系啊,我的意思就是每个页面渲染的时候 都要传,那不是很麻烦

@tofrookie 用模板 EJS或者JADE之类的,头部写一个模板就行了。

@MiguelValentine, Controller层每个页面都要传的

@klamtlne 恩,我说的就是controller层,除了每个传没有别的办法吗

@tofrookie 服务端往客户端传数据,这一步是省略不掉的,你用模版(比如ejs)显示title也还是要配置参数的:res.render({title: 'some title'}) 这个插件可以帮助节省一些重复劳动: https://github.com/dwightjack/grunt-ejs-render

写一个 dynamicHelper。

如果你用 express 的话,就写一个全局中间件,每次有访问都将 res.locals.current_user 赋值为 req.session.user,这样就可以在 view 中直接使用 current_user 了。

@alsotang 这个助手 express4.0不是不能用了吗

@alsotang 谢啦,已解决

@alsotang 我刚看了下文档,原来我locals用错了,我开始就是写全局中间件的

@alsotang 这方法略屌,学习了

@alsotang 这里还有个问题,写了一个userLoged函数:

    exports.userLoged = function (req, res, user) {
	    res.locals.user = req.session.user = user
	}

之后在view层如果直接这样要报错的

    <h1><%- res.locals.user %></h1>

res.render 中传参这一步还是省略不掉吧

@klamtlne 你的 userLoged 中间件需要重写,现在这样写是不对的。next 参数都没有接收。

@alsotang next 这个函数我理解是如果你访问 /user/edit ,如果这个请求的handler直接调用 next(),请求会被指到 /user(如果有的话)来操作。 这里是用户登录后把用户保存到locals,登录的操作发生在 post: /login,为什么要使用next呢?

@klamtlne 你看看 nodeclub 源码的这一部分实例嘛

@alsotang 我造了,app.get('/follow', user.required, user.follow) 这里,在user.required调用 next() 的话就会到user.follow ( ´ ▽ ` )

@alsotang 我作死把route这里重写了,在contoller里根据文件名分流,破坏了原来的中间件机制(具体可见:https://github.com/klamtlne/Nodelog/blob/master/controllers/index.js ) ,我得想想怎么把中间件加进去…

回到顶部