当前位置:网站首页>深入浅出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), {}))
边栏推荐
- P7735-[noi2021] heavy and heavy edges [tree chain dissection, line segment tree]
- MySQL master-slave replication
- 【按鍵消抖】基於FPGA的按鍵消抖模塊開發
- Serial port-rs232-rs485-ttl
- Scalpel like analysis of JVM -- this article takes you to peek into the secrets of JVM
- Brief tutorial for soft exam system architecture designer | general catalog
- Stc8h development (XII): I2C drive AT24C08, at24c32 series EEPROM storage
- Esp32 (based on Arduino) connects the mqtt server of emqx to upload information and command control
- Fundamentals of SQL database operation
- Prime protocol announces cross chain interconnection applications on moonbeam
猜你喜欢
Record an excel xxE vulnerability
Fundamentals of SQL database operation
Do you know cookies, sessions, tokens?
Network security - Security Service Engineer - detailed summary of skill manual (it is recommended to learn and collect)
C#(三十一)之自定义事件
WPF效果第一百九十一篇之框选ListBox
自动化测试的好处
No qualifying bean of type ‘......‘ available
【可调延时网络】基于FPGA的可调延时网络系统verilog开发
Database, relational database and NoSQL non relational database
随机推荐
Global and Chinese markets for patent hole oval devices 2022-2028: Research Report on technology, participants, trends, market size and share
自动化测试的好处
Fundamentals of SQL database operation
Développement d'un module d'élimination des bavardages à clé basé sur la FPGA
[FPGA tutorial case 11] design and implementation of divider based on vivado core
/usr/bin/gzip: 1: ELF: not found/usr/bin/gzip: 3: : not found/usr/bin/gzip: 4: Syntax error:
【按键消抖】基于FPGA的按键消抖模块开发
Global and Chinese market of aircraft anti icing and rain protection systems 2022-2028: Research Report on technology, participants, trends, market size and share
10 exemples les plus courants de gestion du trafic istio, que savez - vous?
Detailed explanation of serialization and deserialization
DM8 archive log file manual switching
Redis (replicate dictionary server) cache
1291_Xshell日志中增加时间戳的功能
51nod 1130 n factorial length V2 (Stirling approximation)
C (thirty) C combobox listview TreeView
Basic knowledge of binary tree, BFC, DFS
Database, relational database and NoSQL non relational database
Alibaba testers use UI automated testing to achieve element positioning
Global and Chinese market of plasma separator 2022-2028: Research Report on technology, participants, trends, market size and share
自动化测试怎么规范部署?