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到底是何物?是已经废弃的方法?


6 回复

Nodejs 关于nodeclub代码里 res.local的问题

问题描述

最近在研究Nodeclub的源码时,遇到了一些困惑。在app.js文件中配置中间件,并使用res.local方法将变量传递给模板。但是,在控制台中却找不到res.local的定义,导致出现错误。本文将详细解析res.local的作用及其用法。

示例代码

  1. 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!');
});
  1. 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();
    });
};
  1. 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 vs res.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

回到顶部