javascript - 装饰重新渲染

标签 javascript node.js express decorator restify

我正在尝试用此代码装饰 Restify 路由器中的渲染函数...

装饰.js

module.exports = function (server) {
    return function (req, res, next) {
        function newRender(orig) {
            return function(path, params, query) {
                return "http://localhost:3000" + orig(path, params, query);
            }
        }
    server.router.render = newRender(server.router.render);
    next();
    }
}

在我的 server.js 中

var restify = require("restify");
var decorate = require("./decorate");
var server = restify.createServer();

server.pre(decorate(server));

server.get({name: "get_user", path: "/users/:id"}, function(req, res){
    res.send(req.params.id);
});

server.get("/decorate", function(req, res){
    res.send({data: server.router.render("get_user", {id: 2})});
});


server.listen(3000);

但我只收到这个错误。请帮忙。 {“code”:“InternalError”,“message”:“无法读取未定义的属性“get_user””}

最佳答案

您正在传递原始 render 方法,并将全局 this 作为上下文。只需在传递时将 server.router 绑定(bind)为上下文即可:

original_render = server.router.render;

function decorate(){
...
server.router.render = newRender(original_render.bind(server.router));
...
}

更新:将原始渲染方法的引用保留在中间件函数之外。否则会出现一堆 newRender 调用,并且请求不断增加。

关于javascript - 装饰重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778846/

相关文章:

node.js - 这两条路线在nodejs中是否相同?

javascript - Windows Phone 8.1 使用 javascript 保存数据

javascript - react Cytoscape JS : All nodes are accumulated in one position

javascript - JointJS 中的自动换行

javascript - 在创建主窗口之前,如何在主进程中安全地预加载内容?

node.js - 无法在 Ubuntu 中使用 Express.js

javascript - 如何在单击时切换 AccordionContainer?

.net - 无法在 Windows 上安装 Node.js 包

sockets - 一台机器上的两个(或更多)套接字客户端连接

Javascript/Node : store return value of a function into a variable