如何解决有没有一种方法可以使用Node / Express在不阻塞服务器的情况下运行D3.js来响应http请求?
我已经使用d3.js在使用node和jsdom的服务器上生成svg / html。我还测试了Web请求中服务器上d3的使用,以生成动态的svg / html,然后在模板/视图(ejs)中使用。这样做的问题是,任何重要的d3.js代码都会阻塞服务器,并迫使其他Web请求等待,直到生成svg / html。有没有一种方法可以在nodejs / express中使用d3在Web请求中生成动态svg / html,而不会阻塞服务器?
我想知道是否存在异步方式来编写d3,或者是否有一种使用其他工作程序以避免阻塞的方式使用d3(和jsdom)生成svg / html的方法。
以下是一些可能要在服务器而不是客户端上执行此操作的原因:预先渲染svg / html并将其在快速模板中使用将为用户提供统一的页面加载,而无需svg的“刷新” / html在页面加载后被绘制,就像在客户端中使用d3一样。您还可以避免向浏览器发送大量数据,并使d3代码专有。
这是一个基本示例,说明我在快速路由中使用d3可能会阻止服务器处理其他传入的Web请求的情况。
app.get("/",async function(req,res) {
// get dynamic data from database based on req.query
let data = await dbConnection.query(dynamic_sql)
// create simulated DOM using jsdom. This step will block server.
const { document } = (new JSDOM(``)).window;
// use d3 to draw svg. This step will block server.
let selection = d3.select(document).select("body")
selection.selectAll("circle")
.data(data).enter()
.append("circle").attr("r",5).attr("cx",10).attr("cy",10)
// extract svg string
let svgString = selection.node().innerHTML
// pass svgString to template to render page for client
res.render("/",{svgString: svgString})
}
如果您有任何想法,请告诉我!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。