首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Javascript/Node.jsAzure函数中使用需要DOM和窗口的导入脚本

如何在Javascript/Node.jsAzure函数中使用需要DOM和窗口的导入脚本
EN

Stack Overflow用户
提问于 2019-06-25 03:39:19
回答 2查看 940关注 0票数 1

我试图在Azure函数中使用外部javascript ( javascript/node.js风味)。由于外部javascript (我需要使用kendo)依赖于一个DOM和一个窗口,所以我尝试使用JSDOM (但如果有更好/更简单的替代方法,则不必使用JSDOM )。

这是我所拥有的一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var html = '<!DOCTYPE html>'
    + '<html>'
    +   '<head>'
    +       '<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>'
    +       '<script src="https://kendo.cdn.telerik.com/2019.2.514/js/kendo.all.min.js"></script>'
    +   '</head>'
    +   '<body>'
    +       '<script>'
    +           'var myDiv = document.createElement("div");'        
    +           'myDiv.innerHTML = "Hello World";'
    +           'document.body.appendChild(myDiv);'
    +       '</script>'
    +   '</body>'
    + '</html>'
    ;

    var jsdom = require('jsdom');
    const { JSDOM } = jsdom;

    const dom = new JSDOM(html, {
        runScripts: "dangerously",
        resources: "usable"
    });

    var test = dom.serialize();
    context.log(test);

    context.res = {
        body: test
    };
};

在运行此Azure函数时,应该包括jquery和kendo,并创建包含"Hello“的div。不过,这不管用。

创建的脚本只有在我注释掉

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+       '<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>'
+       '<script src="https://kendo.cdn.telerik.com/2019.2.514/js/kendo.all.min.js"></script>'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resources: "usable"

但是,我不能使用jquery和kendo。

根据这个jsdom 文档,参数资源:“可用”应该能起作用,但是由于某种原因,它不能工作。

我使用的是"jsdom":"^15.1.1“

UPDATE:我尝试了一个解决办法,添加这样的脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var html = '<!DOCTYPE html>'
    + '<html>'
    +   '<head>'
    +   '</head>'
    +   '<body>'
    +       '<script>'
    +           'var myDiv = document.createElement("div");'        
    +           'myDiv.innerHTML = "Hello World";'
    +           'document.body.appendChild(myDiv);'
    +           'var scriptTag = document.createElement("script");'        
    +           'scriptTag.innerHTML = window.jqueryString;'
    +           'document.head.appendChild(scriptTag);'
    +       '</script>'
    +   '</body>'
    + '</html>'
    ;

    var jsdom = require('jsdom');
    const { JSDOM } = jsdom;

    var fs = require("fs");
    global.jqueryString = fs.readFileSync(__dirname + '//jquery.js').toString();
    //context.log(jqueryString);

    const dom = new JSDOM(html, {
        runScripts: "dangerously"
    });

    var test = dom.serialize();
    context.log(test);


    context.res = {
        body: test
    };
};

这是在头中添加一个脚本标记,但是innerHTML是“未定义的”,而不是jqueryString。在JSDOM之外(请参阅注释行),日志记录jqueryString按预期显示jquery.js的内容。但是在JSDOM内部,这个变量似乎不可用。如何将jqueryString传递给JSDOM?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-01 04:16:07

在@PeterPan的输入下,我成功地使用带有基于码头的Azure函数木偶师解决了我的问题。

基于Init码头的FunctionApp:

func init MyFunctionProj --docker (选择->节点-> javascript)

编辑MyFunctionProj\Dockerfile以使用estruyf/azure-功能-节点-傀儡和fs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM estruyf/azure-function-node-puppeteer
RUN npm i fs
COPY . /home/site/wwwroot

将fs添加到MyFunctionProj\package.json中的依赖项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"dependencies": {
    "fs": "0.0.1-security"
  }

创建HttpTrigger函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd MyFunctionProj
func new --name MyHttpTrigger --template "HttpTrigger"

准许行使职能:

"authLevel": "anonymous"中设置MyFunctionProj\MyHttpTrigger\function.json (原因见这里。)

创建MyFunctionProj\MyHttpTrigger\content.html文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>ContentHtml</title>

    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2019.2.514/js/kendo.all.min.js"></script>
</head>
<body>

<script>
    $(document).ready(function() {
       var myComputationResult = .... // use included scripts to perform computation
       $("#resultData").html(JSON.stringify(myComputationResult));
    });
</script>
<div id="resultData"></div>
</body>
</html>

在MyFunctionProj\MyHttpTrigger\index.js中编辑功能逻辑(基于):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const puppeteer = require('puppeteer');
const fs = require("fs");

module.exports = async (context, req) => {    
    const browser = await puppeteer.launch({
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    });

    var contentHtml = fs.readFileSync(__dirname + '//content.html', 'utf8');

    const page = await browser.newPage();
    await page.goto(`data:text/html,${contentHtml}`, { waitUntil: 'networkidle2' });
    const resultData = await page.evaluate(() => document.querySelector('#resultData').innerHTML);
    await browser.close();

    context.res = {
        // status: 200, /* Defaults to 200 */
        body: `Result: ${resultData}`
    };
};

建立码头形象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build --tag <docker-id>/mydockerimage:v1.0.0 .

运行码头图像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 8080:80 -it <docker-ID>/mydockerimage:v1.0.0

在浏览器中测试本地函数图像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:8080/api/MyHttpTrigger

将图像推送到码头枢纽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker login --username <docker-id>
docker push <docker-id>/mydockerimage:v1.0.0

创建一个新的Azure功能在线和使用图像从码头集线器描述的这里

票数 0
EN

Stack Overflow用户

发布于 2019-06-27 20:34:12

我仔细检查了jsdom节点包,然后我发现Loading subresources功能需要一个无头浏览器,比如通过karma的无头浏览器。但是,由于使用了Win32k.sys (User32/GDI32) Restrictions of Azure Web App sandbox,在上,它将永远无法正常工作,因为无头浏览器需要GDI支持。

因此,我建议您需要将您的函数迁移到Linux函数(它基于Docker ),通过Azure Functions Core Tools重新构建它,就像官方文档Create your first function hosted on Linux using Core Tools and the Azure CLI (preview)说的那样。或者您必须使用Windows,Azure Windows VM将是您的最佳选择。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56753243

复制
相关文章
JavaScript中DOM查询封装函数
在JavaScript中可以通过BOM查询html文档中的元素,也就是所谓的在html中获取对象然后对它添加一个函数。
马克社区
2022/04/14
6290
JavaScript 中 的 DOM 和 BOM
1.ECMAScript 为 JavaScript 提供核心语言功能,是由欧洲计算机制造商协会(ECMA)39号技术委员会(TC39)制定的一种通用、跨平台、供应商中立的脚本语言和语义。ECMAScript 是一种由 ECMA 组织通过 ECMA-262 标准化的脚本程序设计语言。ECMA-262 标准没有参考 Web 浏览器,它规定了语言的语法、类型、语句、关键字、保留字、操作符、对象。
李振
2021/11/26
4730
JavaScript中的Dom和Bom
当创建好一个页面并加载到浏览器时,DOM就悄然而生,它会把网页文档转换为一个文档对象,主要功能是处理网页内容。
用户7293182
2022/01/20
9230
JavaScript中的Dom和Bom
如何在spark里面使用窗口函数
在大数据分析中,窗口函数最常见的应用场景就是对数据进行分组后,求组内数据topN的需求,如果没有窗口函数,实现这样一个需求还是比较复杂的,不过现在大多数标准SQL中都支持这样的功能,今天我们就来学习下如何在spark sql使用窗口函数来完成一个分组求TopN的需求。
我是攻城师
2019/06/25
4.2K0
如何在spark里面使用窗口函数
Java中的DOM和Javascript技术
DOM是一门技术,是文档对象模型.所需的文档只有标记型文档,如我们所学的html文档(文档中的所有标签都封装成为对象了)
达达前端
2022/04/29
6610
Java中的DOM和Javascript技术
DOM 节点的克隆和导入
在使用 JS 操作 DOM 节点的时候,我们常常会用到克隆(或导入)节点的操作,那到底有哪些方法可以实现节点克隆(或导入)的效果呢?
编程三昧
2022/02/19
1K0
DOM 节点的克隆和导入
盘点JavaScript中getter()和setter()函数的使用
第一种是 数据属性。已经知道如何使用它们了。到目前为止,使用过的所有属性都是数据属性。
前端进阶者
2021/09/10
1.7K0
盘点JavaScript中getter()和setter()函数的使用
前端必读:如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件
JavaScript在前端领域占据着绝对的统治地位,目前更是从浏览器到服务端,移动端,嵌入式,几乎所有的所有的应用领域都可以使用它。技术圈有一句很经典的话“凡是能用JavaScript实现的东西,最后都会用JavaScript实现”。 Excel 电子表格自 1980 年代以来一直为各行业所广泛使用,至今已拥有超过3亿用户,大多数人都熟悉 Excel 电子表格体验。许多企业在其业务的各个环节中使用了 Excel 电子表格进行数据管理。
葡萄城控件
2022/10/04
4.1K0
前端必读:如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件
13个需要知道的方法:使用 JavaScript 来操作 DOM
DOM 或文档对象模型是 web 页面上所有对象的根。它表示文档的结构,并将页面连接到编程语言。它的结构是一个逻辑树。每个分支结束于一个节点,每个节点包含子节点、对象。DOM API非常庞大,在本文中,咱们只讨论比较常用有有用的那些API。
前端小智@大迁世界
2022/06/15
6720
如何在JavaScript中使用高阶函数
原文链接:https://www.sitepoint.com/higher-order-functions-javascript/[1]
chuckQu
2022/09/20
1.5K0
第61节:Java中的DOM和Javascript技术
DOM是一门技术,是文档对象模型.所需的文档只有标记型文档,如我们所学的html文档(文档中的所有标签都封装成为对象了)
达达前端
2019/07/03
6240
第61节:Java中的DOM和Javascript技术
JavaScript中的compose函数和pipe函数
compose函数可以将需要嵌套执行的函数平铺,嵌套执行就是一个函数的返回值将作为另一个函数的参数。我们考虑一个简单的需求:
蒋鹏飞
2020/10/15
1.6K0
js匿名函数和命名函数_javascript中的函数
匿名函数在iframe里定义,而在“容器”页面执行,而$(“#map_workspace”)对象很明显在“容器”页面上,但偏偏,没有获得我们预期的结果。改为:
全栈程序员站长
2022/09/27
2.8K0
Javascript中普通函数和箭头函数的区别
2.箭头函数没有this对象,他会找到上层调用者作为this对象,直至window。还有,由于箭头函数没有自己的this,所以call,apply,bing等方法都不能改变this指向。
小明爱学习
2020/07/09
9970
如何使用JavaScript导入和导出Excel文件
JavaScript是一个涵盖多种框架、直译式、可以轻松自定义客户端的脚本语言,在 Web 应用程序中,更加易于编码和维护。而Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面、出色的计算性能和图表工具,已经成为数据统计领域不可或缺的软件之一。
葡萄城控件
2019/07/11
6.7K0
如何使用JavaScript导入和导出Excel文件
Javascript中DOM技术的的简单学习
别先生
2017/12/29
1.1K0
Javascript中DOM技术的的简单学习
shell脚本的函数介绍和使用案例
#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同
老油条IT记
2020/04/01
1.7K0
shell脚本的函数介绍和使用案例
pandas中的窗口处理函数
滑动窗口的处理方式在实际的数据分析中比较常用,在生物信息中,很多的算法也是通过滑动窗口来实现的,比如经典的质控软件Trimmomatic, 从序列5'端的第一个碱基开始,计算每个滑动窗口内的碱基质量平均值,当滑动窗后的平均碱基质量值小于给定阈值时,去除该窗口以及之后的剩余碱基,以此达到去除低质量碱基的目的。
生信修炼手册
2020/07/14
2K0
10 - JavaScript 中的函数 & 11 - JavaScript 中函数的种类
原文地址:https://dev.to/bhagatparwinder/functions-in-javascript-5ehm
前端黑板报
2022/12/01
2.8K0
mysql窗口函数over中rows_MySQL窗口函数
窗口函数是OVER(),其中对应子句有PARTITION BY 以及 ORDER BY子句,所以形式有:
全栈程序员站长
2022/11/10
5.9K0

相似问题

如何在javascript中创建DOM窗口?

20

导入脚本模块和装载DOM

11

在阴影DOM中导入和使用Javascript

14

JavaScript函数和DOM

20

DOM,javascript,如何使用打开的窗口

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文