当前位置:网站首页>深入浅出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), {}))
边栏推荐
- Prime protocol announces cross chain interconnection applications on moonbeam
- 在 .NET 6 中使用 Startup.cs 更简洁的方法
- Align items and align content in flex layout
- Database, relational database and NoSQL non relational database
- 20、 EEPROM memory (AT24C02) (similar to AD)
- Scalpel like analysis of JVM -- this article takes you to peek into the secrets of JVM
- Detailed explanation of serialization and deserialization
- Error 1045 (28000): access denied for user 'root' @ 'localhost' (using password: no/yes
- MySQL reads missing data from a table in a continuous period of time
- Record the pit of NETCORE's memory surge
猜你喜欢
C#(二十七)之C#窗体应用
How to standardize the deployment of automated testing?
Security xxE vulnerability recurrence (XXe Lab)
Blue Bridge Cup - day of week
ESP32(基于Arduino)连接EMQX的Mqtt服务器上传信息与命令控制
Error 1045 (28000): access denied for user 'root' @ 'localhost' (using password: no/yes
Exchange bottles (graph theory + thinking)
阿里测试师用UI自动化测试实现元素定位
【FPGA教程案例11】基于vivado核的除法器设计与实现
Record the pit of NETCORE's memory surge
随机推荐
Solution to the problem that the root account of MySQL database cannot be logged in remotely
在字节做测试5年,7月无情被辞,想给划水的兄弟提个醒
No qualifying bean of type ‘......‘ available
WPF效果第一百九十一篇之框选ListBox
Brief tutorial for soft exam system architecture designer | general catalog
Why do you want to start pointer compression?
Prime protocol announces cross chain interconnection applications on moonbeam
How to standardize the deployment of automated testing?
2/10 parallel search set +bfs+dfs+ shortest path +spfa queue optimization
C (thirty) C combobox listview TreeView
Chinese brand hybrid technology: there is no best technical route, only better products
有条件地 [JsonIgnore]
[Zhao Yuqiang] deploy kubernetes cluster with binary package
【按鍵消抖】基於FPGA的按鍵消抖模塊開發
Ipv4中的A 、B、C类网络及子网掩码
Cf464e the classic problem [shortest path, chairman tree]
Plus d'un milliard d'utilisateurs de grandes entreprises comme Facebook ont été compromis, il est temps de se concentrer sur le did
C language -- structs, unions, enumerations, and custom types
Python book learning notes - Chapter 09 section 01 create and use classes
MySql数据库root账户无法远程登陆解决办法