当前位置:网站首页>深入浅出node模板解析错误escape is not a function
深入浅出node模板解析错误escape is not a function
2022-07-06 04:06:00 【xzlAwin】
深入浅出node模板解析错误escape is not a function
操作
var escape = function (html) {
return String(html)
.replace(/&(?!\w+;)/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
}
var complie = function (str) {
console.log(str)
var tpl = str.replace(/<%=([\s\S]+?)%>/g, function (match, code) {
// 转义
return "' + escape(" + code + ") + '"
}).replace(/<%-([\s\S]+?)%>/g, function (match, code) {
// 正常输出
return "' + " + code + " + '"
}).replace(/<%([\s\S]+?)%>/g, function (match, code) {
return "';\n" + code + "\n tpl += '"
}).replace(/\'\n/g, '\'')
.replace(/\n\'/gm, '\'')
console.log('----------代码替换模板----------')
console.log(tpl)
tpl = "tpl = '" + tpl + "'"
tpl = tpl.replace(/''/g, '\'\\n\'')
tpl = ' var tpl = ""\n with (obj || {}) {\n ' + tpl + '\n }\n return tpl'
return new Function('obj', 'escape', tpl)
}
var render = function(complie, data) {
console.log('----------构造函数----------')
console.log(complie.toString())
console.log('----------运行函数----------')
return complie(data)
}
var tpl = [
'<% if (obj.user) { %>',
'<h2><%=user.name%></h2>',
'<% } else { %>',
'<h2>匿名用户</h2>',
'<% } %>'].join('\n')
console.log('----------模板----------')
console.log(tpl)
console.log(render(complie(tpl), {user: {name: 'Jackson Tian'}}))
//console.log('\n\n')
//console.log(render(complie(tpl), {}))
异常信息
TypeError: escape is not a function
at eval (eval at complie (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:27:10), <anonymous>:7:21)
at render (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:34:9)
at Object.<anonymous> (F:\workspace\javascript workspace\plNode\prj8_5_4_2\src\template4.js:49:13)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at internal/main/run_main_module.js:17:47
分析原因
- escape不是函数,因为 return new Function(‘obj’, ‘escape’, tpl) 语句中 ‘escape’是函数,complie(data, escape) 调用的时候需要传递 escape函数,否则找不到escape函数
解决方法
方法一
- 调用时,传递escape函数
complie(data, escape)
方法二
- 自己调用自己时,传递escape函数
complie.call(complie, data, escape)
# 或者
complie.call(this, data, escape)
完整代码
var escape = function (html) {
return String(html)
.replace(/&(?!\w+;)/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
}
var complie = function (str) {
console.log(str)
var tpl = str.replace(/<%=([\s\S]+?)%>/g, function (match, code) {
// 转义
return "' + escape(" + code + ") + '"
}).replace(/<%-([\s\S]+?)%>/g, function (match, code) {
// 正常输出
return "' + " + code + " + '"
}).replace(/<%([\s\S]+?)%>/g, function (match, code) {
return "';\n" + code + "\n tpl += '"
}).replace(/\'\n/g, '\'')
.replace(/\n\'/gm, '\'')
console.log('----------代码替换模板----------')
console.log(tpl)
tpl = "tpl = '" + tpl + "'"
tpl = tpl.replace(/''/g, '\'\\n\'')
tpl = ' var tpl = ""\n with (obj || {}) {\n ' + tpl + '\n }\n return tpl'
return new Function('obj', 'escape', tpl)
}
var render = function(complie, data) {
console.log('----------构造函数----------')
console.log(complie.toString())
console.log('----------运行函数----------')
return complie(data, escape)
// 等价于
//return complie.call(this, data, escape)
}
var tpl = [
'<% if (obj.user) { %>',
'<h2><%=user.name%></h2>',
'<% } else { %>',
'<h2>匿名用户</h2>',
'<% } %>'].join('\n')
console.log('----------模板----------')
console.log(tpl)
console.log(render(complie(tpl), {user: {name: 'Jackson Tian'}}))
//console.log('\n\n')
//console.log(render(complie(tpl), {}))
边栏推荐
- 关于进程、线程、协程、同步、异步、阻塞、非阻塞、并发、并行、串行的理解
- 【FPGA教程案例12】基于vivado核的复数乘法器设计与实现
- WPF效果第一百九十一篇之框选ListBox
- Prime protocol announces cross chain interconnection applications on moonbeam
- Esp32 (based on Arduino) connects the mqtt server of emqx to upload information and command control
- 【leetcode】1189. Maximum number of "balloons"
- 在字节做测试5年,7月无情被辞,想给划水的兄弟提个醒
- C#(二十九)之C#listBox checkedlistbox imagelist
- 10 exemples les plus courants de gestion du trafic istio, que savez - vous?
- P2648 make money
猜你喜欢
C language -- structs, unions, enumerations, and custom types
Security xxE vulnerability recurrence (XXe Lab)
MySql數據庫root賬戶無法遠程登陸解决辦法
Exchange bottles (graph theory + thinking)
Stack and queue
[adjustable delay network] development of FPGA based adjustable delay network system Verilog
C mouse event and keyboard event of C (XXVIII)
[FPGA tutorial case 11] design and implementation of divider based on vivado core
mysql关于自增长增长问题
综合能力测评系统
随机推荐
math_ Derivative function derivation of limit & differential & derivative & derivative / logarithmic function (derivative definition limit method) / derivative formula derivation of exponential functi
Global and Chinese market of rubber wheel wedges 2022-2028: Research Report on technology, participants, trends, market size and share
JVM的手术刀式剖析——一文带你窥探JVM的秘密
关于进程、线程、协程、同步、异步、阻塞、非阻塞、并发、并行、串行的理解
ESP32_ FreeRTOS_ Arduino_ 1_ Create task
在 .NET 6 中使用 Startup.cs 更简洁的方法
Conditionally [jsonignore]
WPF effect Article 191 box selection listbox
KS003基于JSP和Servlet实现的商城系统
Security xxE vulnerability recurrence (XXe Lab)
判断当天是当月的第几周
自动化测试怎么规范部署?
mysql关于自增长增长问题
DM8 backup set deletion
Ks003 mall system based on JSP and Servlet
Serial port-rs232-rs485-ttl
P3033 [usaco11nov]cow steelchase g (similar to minimum path coverage)
In Net 6 CS more concise method
阿里测试师用UI自动化测试实现元素定位
No qualifying bean of type ‘......‘ available