Nodejs 关于nodeclub代码里 res.local的问题
Nodejs 关于nodeclub代码里 res.local的问题
今天看起nodeclub的源码,先帖上三段代码
这是app.js里的
·app.configure(function () {
//…
app.use(require(’./controllers/sign’).auth_user);
//…
});
·
sign.js中的
exports.auth_user = function (req, res, next) { //… User.findOne({_id: user_id}, function (err, user) { //… res.local(‘current_user’, req.session.user); //… }) //… }
index.html模板里这样用
·
<% if (locals.current_user) { %>
<a href=’/topic/create’ class=‘fr’><button class=‘btn btn-success fr’ id=‘create_topic_btn’>发布话题</button></a>
<% } %>
·
目测功能是判断当前用户状态, 从其用法 看res.local的用法 是往模板里塞变量,可是控制台输出这个res.local 却发现报undefined,不明白了,这个res.local到底是何物?是已经废弃的方法?
Nodejs 关于nodeclub代码里 res.local的问题
问题描述
最近在研究Nodeclub的源码时,遇到了一些困惑。在app.js
文件中配置中间件,并使用res.local
方法将变量传递给模板。但是,在控制台中却找不到res.local
的定义,导致出现错误。本文将详细解析res.local
的作用及其用法。
示例代码
- app.js
var express = require('express');
var app = express();
app.configure(function () {
// 配置中间件
app.use(require('./controllers/sign').auth_user);
// 其他配置
});
app.listen(3000, function () {
console.log('App listening on port 3000!');
});
- sign.js
module.exports.auth_user = function (req, res, next) {
var user_id = req.session.userId;
User.findOne({_id: user_id}, function (err, user) {
if (err) return next(err);
if (!user) return res.redirect('/signin');
// 将变量 current_user 添加到模板上下文中
res.locals.current_user = user;
next();
});
};
- index.ejs
<!DOCTYPE html>
<html>
<head>
<title>NodeClub</title>
</head>
<body>
<% if (locals.current_user) { %>
<a href='/topic/create' class='fr'>
<button class='btn btn-success fr' id='create_topic_btn'>发布话题</button>
</a>
<% } %>
</body>
</html>
解析
-
res.locals
vsres.local
: 在Express中,res.locals
是一个对象,用于存储在渲染模板之前传递给模板的数据。它类似于一个本地变量,仅在请求处理过程中有效。你可能看到的
res.local
可能是由于拼写错误或者误解了文档。正确的应该是res.locals
。 -
res.locals
用法:res.locals
通常在中间件或路由处理函数中设置,用于向模板传递数据。例如,在上面的sign.js
文件中,我们通过User.findOne
查询用户信息,并将其添加到res.locals.current_user
中。 -
模板渲染: 在模板文件(如
index.ejs
)中,你可以通过<%= locals.current_user %>
访问这些变量。在上述示例中,如果current_user
存在,则显示一个按钮,允许用户发布话题。
总结
res.locals
是一个非常有用的功能,用于在模板中传递数据。确保正确使用res.locals
而不是res.local
,并确保在中间件或路由处理函数中正确设置。这样可以避免常见的拼写错误和其他问题。希望这能帮助你更好地理解Nodeclub代码中的这部分内容。
(╯_╰) 我去,发出来怎么这么凌乱。。 PS:node版本为最新0.8,不是直接拿nodeclub代码运行
cnode 是使用的"express": "2.5.1" 现在express 3.0 改了不少
res.local还是蛮有用的, express3.X 有无替代方案?
API接口改了 如果使用res.local 请改成 res.locals.current_user = req.session.user;
res.local
并不是一个标准的 Node.js 或 Express 框架的方法。在你提到的代码中,可能是 res.locals
的拼写错误或者是自定义的一个方法。通常情况下,我们使用的是 res.locals
来向模板传递数据。
解释
-
res.locals
: 这是一个对象,用于存储响应级别的变量和函数,这些变量和函数可以在模板中访问。 -
在你的例子中,
res.local('current_user', req.session.user);
应该是res.locals.current_user = req.session.user;
。
示例代码
修改后的 sign.js 文件
exports.auth_user = function (req, res, next) {
// 假设这里有一些代码来查找用户
User.findOne({ _id: user_id }, function (err, user) {
if (err) return next(err);
if (!user) return res.send('User not found');
// 将当前用户信息存储到 res.locals 中
res.locals.current_user = req.session.user;
// 继续处理请求
next();
});
};
模板文件 index.html
<% if (locals.current_user) { %>
<a href='/topic/create' class='fr'>
<button class='btn btn-success fr' id='create_topic_btn'>发布话题</button>
</a>
<% } %>
总结
res.locals
是一个内置的属性,用于向模板传递数据。你遇到的问题可能是因为 res.local
是拼写错误或者是一个不存在的方法。正确的应该是 res.locals
。