装饰 restify 渲染
Decorate restify render
我正在尝试用这段代码在 restify 的路由器中装饰渲染函数...
decorate.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":"Cannot read property 'get_user' of undefined"}
您正在传递以全局 this
作为上下文的原始 render
方法。传递时只需将 server.router
绑定为上下文:
original_render = server.router.render;
function decorate(){
...
server.router.render = newRender(original_render.bind(server.router));
...
}
更新:你在中间件函数之外保留了原始渲染方法的引用。否则会有一堆请求增加的newRender调用。
我正在尝试用这段代码在 restify 的路由器中装饰渲染函数...
decorate.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":"Cannot read property 'get_user' of undefined"}
您正在传递以全局 this
作为上下文的原始 render
方法。传递时只需将 server.router
绑定为上下文:
original_render = server.router.render;
function decorate(){
...
server.router.render = newRender(original_render.bind(server.router));
...
}
更新:你在中间件函数之外保留了原始渲染方法的引用。否则会有一堆请求增加的newRender调用。