有没有一种方法可以使用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 (将#修改为@)