Nodejs开发指南微博实例视图助手问题

Nodejs开发指南微博实例视图助手问题

现在的express已经是第四版了,可是书上的是第二版,两个版本之间有很大的变化,所以学习起来真的很蛋疼!不断的google,今天下午终于到了微博实例中的注册了,网上说helpers 和 dynamicHelpers 方法已经不能用了,需要改掉:var util = require(‘util’); app.locals({ inspect: function(obj){ return util.inspect(obj, true); } }); app.use(function(req, res, next){ res.locals.headers = req.headers; next(); }); app.get(’/helper’, function(req, res){ res.render(‘helper’,{ title: ‘Helpers’ }); }); 我按照这个修改,得到的错误是: property locals of object function … is not defined,求教这是为什么。另外有没有针对最新版本的微博实例,这样版本不一样学起来真的很费劲


5 回复

Node.js 开发指南微博实例视图助手问题

目前 Express 已经升级到第四版,而很多教程还是基于旧版本的。这导致了很多初学者在学习过程中遇到困惑。本文将帮助你解决在使用 Express 4.x 版本时遇到的一些视图助手(view helpers)问题。

问题描述

在旧版本中,我们可以使用 app.localsapp.dynamicHelpers 来设置全局变量或动态视图助手。但在 Express 4.x 中,这些方法已经被废弃,我们需要找到新的方法来实现相同的功能。

解决方案

  1. 使用中间件设置全局变量 在 Express 4.x 中,我们可以通过中间件来设置全局变量。例如,我们可以在请求处理链中添加一个中间件来将请求头(headers)传递给视图。

    const express = require('express');
    const app = express();
    
    // 设置中间件来传递请求头
    app.use((req, res, next) => {
        res.locals.headers = req.headers;
        next();
    });
    
    app.get('/helper', (req, res) => {
        res.render('helper', {
            title: 'Helpers'
        });
    });
    
    module.exports = app;
    
  2. 自定义视图助手 如果你需要自定义视图助手,可以使用类似的方法。例如,如果你想在视图中使用 util.inspect 方法来调试对象,可以创建一个中间件来注入该功能。

    const express = require('express');
    const util = require('util');
    const app = express();
    
    // 设置中间件来注入 util.inspect 方法
    app.use((req, res, next) => {
        res.locals.inspect = (obj) => {
            return util.inspect(obj, { showHidden: true, depth: null });
        };
        next();
    });
    
    app.get('/helper', (req, res) => {
        res.render('helper', {
            title: 'Helpers',
            obj: { key: 'value' }
        });
    });
    
    module.exports = app;
    
  3. 视图模板示例 假设你的视图模板文件 helper.ejs 如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title><%= title %></title>
    </head>
    <body>
        <h1>Headers:</h1>
        <pre><%- JSON.stringify(headers, null, 2) %></pre>
        <h1>Object Inspect:</h1>
        <pre><%- inspect(obj) %></pre>
    </body>
    </html>
    

通过以上步骤,你可以成功地在 Express 4.x 中设置视图助手,并将其应用到你的微博实例项目中。希望这能帮助你顺利过渡到新版本的 Express。


看一下express的文档啊。app.locals是用来给视图模板里注册方法和变量的,express3.0以上才有吧

Express 4 刚出不久,只能自己看英文文档,Express 3 中文资料多一点。

根据你的描述,你在使用Express 4.x时遇到了一些问题,因为Express 2.x和4.x之间有很多不同之处。在Express 4.x中,app.localsdynamicHelpers 方法已经被废弃或更改。你需要使用中间件来设置共享的数据。

你可以使用如下方法来实现类似的功能:

示例代码

const express = require('express');
const app = express();

// 设置一个中间件来共享数据
app.use((req, res, next) => {
    res.locals.utilInspect = (obj) => {
        return require('util').inspect(obj, { showHidden: true, depth: null });
    };
    res.locals.headers = req.headers;
    next();
});

// 渲染模板时可以使用这些共享的数据
app.get('/helper', (req, res) => {
    res.render('helper', {
        title: 'Helpers'
    });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 中间件:在Express 4.x中,你可以通过中间件来设置全局变量。这里我们定义了一个中间件,它会将 util.inspect 函数和请求头添加到 res.locals 中。
  2. 共享数据res.locals 是一个对象,可以存储当前请求相关的数据。在渲染模板时,你可以访问这些数据。
  3. 渲染模板:在路由处理函数中,你可以使用 res.render 来渲染模板,并传递需要的数据。

错误原因

你遇到的错误可能是由于 locals 对象没有正确地被设置。在Express 4.x中,你需要通过中间件来设置 res.locals,而不是直接通过 app.locals

希望这能帮助你解决遇到的问题。如果你还有其他疑问,请随时提问。

回到顶部