如何在服务端JavaScript文件中调用HTML内定义的CreateCard函数
为什么你当前的写法不生效
fs.readFile 读取得到的data是HTML文件的原始字符串/Buffer内容,并不是浏览器中运行的页面上下文对象。HTML里定义的CreateCard是客户端运行时函数,只能在用户浏览器加载完HTML后在浏览器环境执行,和服务端Node.js运行环境完全隔离,不可能直接在服务端调用。
正确实现方式
方案1:服务端注入调用代码(最贴合你现有逻辑的方案)
你不需要在服务端执行这个函数,只需要把要调用的参数拼接成JS代码,插到返回的HTML内容末尾,浏览器加载页面后会自动执行这些调用:
app.get('/', function (req, res) { res.writeHead(200, { 'Content-Type': 'text/html' }) fs.readFile('./https/home.html', function(err, data) { if (err) { console.log("ERROR, ERROR") res.writeHead(404) res.write('Error | File Not Found') return res.end() } res.write(data) // 插入执行脚本 res.write(`<script>`) let limiteds = GetLimiteds() limiteds.forEach((itemData) => { const cacheVal = client.get(GetKey(itemData.itemID, itemData.itemClassName)) if (cacheVal && cacheVal != 0) { // 用JSON.stringify处理参数,避免字符串特殊字符引发语法错误 res.write(`CreateCard( ${JSON.stringify(itemData.itemName)}, ${JSON.stringify(itemData.itemClassName)}, ${JSON.stringify(itemData.itemID)}, ${JSON.stringify(cacheVal)}, ${JSON.stringify(itemData.MaxAllowed)} );`) } }) res.write(`</script>`) res.end() }) });
方案2:前后端解耦实现
你也可以单独新增一个接口返回limiteds数组数据,HTML页面加载完成后,前端主动请求该接口,拿到数据后自行循环调用CreateCard函数。这种方案逻辑更清晰,也方便后续维护扩展。
内容的提问来源于stack exchange,提问作者SpencerIsCool
相关产品推荐
相关产品推荐

