当前位置: 首页 > 面试题库 >

Node.js / Express.js-如何覆盖/拦截res.render函数?

高修伟
2023-03-14
问题内容

我正在使用Connect /
Express.js构建Node.js应用,我想在将其转发到原始渲染功能之前拦截res.render(view,option)函数以运行一些代码。

app.get('/someUrl', function(req, res) {

    res.render = function(view, options, callback) {
        view = 'testViews/' + view;
        res.prototype.render(view, options, callback);
    };

    res.render('index', { title: 'Hello world' });
});

它看起来像一个人为的示例,但确实适合我正在构建的总体框架。

我对JavaScript的OOP和原型继承的了解有点薄弱。我该怎么做?

更新: 经过一些试验,我想到了以下内容:

app.get('/someUrl', function(req, res) {

    var response = {};

    response.prototype = res;

    response.render = function(view, opts, fn, parent, sub){
        view = 'testViews/' + view;
        this.prototype.render(view, opts, fn, parent, sub);
    };

    response.render('index', { title: 'Hello world' });
});

它似乎有效。当我为每个请求创建一个新的响应包装对象时,不确定是否是最好的解决方案,这会成为问题吗?


问题答案:

老问题,但发现自己在问同样的事情。如何截取res渲染?现在使用express 4.0x。

您可以使用/编写中间件。起初,这个概念对我来说有点令人生畏,但经过阅读后,它变得更有意义了。只是对于某些阅读本文的人来说,重写res.render的动机是提供全局视图变量。我希望session在所有模板中都可用,而不必在每个res对象中都键入它。

基本的中间件格式是。

app.use( function( req, res, next ) {
    //....
    next();
} );

下一个参数和函数调用对于执行至关重要。next是回调函数,允许多个中间件在不阻塞的情况下完成其任务。有关更好的解释,请点击此处

然后可以用来覆盖渲染逻辑

app.use( function( req, res, next ) {
    // grab reference of render
    var _render = res.render;
    // override logic
    res.render = function( view, options, fn ) {
        // do some custom logic
        _.extend( options, {session: true} );
        // continue with original render
        _render.call( this, view, options, fn );
    }
    next();
} );

我已经使用express 3.0.6测试了此代码。它应该可以与4.x一起正常工作。您还可以使用覆盖特定的URL组合

app.use( '/myspcificurl', function( req, res, next ) {...} );


 类似资料:
  • 拦截文件 bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) bp GetPrivateProfileStringA (ini文件)

  • 拦截时间 bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数

  • 拦截窗口 bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本

  • 拦截注册表 bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健

  • 拦截消息框 bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框

  • 拦截驱动器 bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径