首页 > 解决方案 > NodeJS将数据返回到客户端浏览器

问题描述

我想我们在这里需要一些帮助。提前致谢。

我一直在 .Net 中为桌面应用程序进行编程,并且在任务结果显示在数据网格中之前使用 Timer 对象等待任务完成。最近,我们切换到 NodeJs 并发现它非常有趣。我们可以设计一个小型应用程序,使用 PowerShell 脚本执行一些任务并将数据返回到客户端浏览器。但是,我必须在客户端浏览器上执行 Timer(当有人单击按钮时)以查看 Timer 从服务器接收的文件是否具有“ENDOFDATA”。一旦 Timer 看到 ENDOFDATA,它就会触发另一个函数来使用从服务器接收到的数据填充 DIV。

这是从服务器获取数据的正确方法吗?我们真的不想阻塞 EventLoop。我们在 NodeJS 上运行 PowerShell 脚本以从 Active Directory 收集用户,然后将数据发送回客户端浏览器。PowerShell 脚本作为作业执行,因此不会阻止 EventLoop。

以下是 NodeJs 上的代码示例:

在下面的代码中,我们是否可以插入一些不会阻塞 EventLoop 但在任务完成后仍会响应服务器的内容?正如您在下面的代码中所见,我们希望在 GetUsers.PS1 完成执行后将 ADUsers.CSV 文件发送到客户端浏览器。由于 GetUSers.PS1 需要大约 5 分钟才能完成,因此事件循环被阻止,服务器无法再接受任何其他请求。

app.post("/LoadDomUsers", (request, response) => {
//we check if the request is an AJAX one and if accepts JSON
if (request.xhr || request.accepts("json, html") === "json") {

    var ThisAD = request.body.ThisAD
    console.log(ThisAD);

    ps.addCommand("./public/ps/GetUsers.PS1", [{
        name: 'AllParaNow',
        value: ScriptPara
    }])
    ps.addCommand(`$rc = gc ` + __dirname + "/public/TestData/AD/ADUsers.CSV");
    ps.addCommand(`$rc`);
    ps.invoke().then((output) => {
         response.send({ message: output });
         console.log(output);
    });
}

});

谢谢你。

标签: javascripthtmlnode.jspowershelltimer

解决方案


你描述问题的方式不是很清楚。我必须阅读您最初问题中的一些评论,以确保我理解了这个问题。老实说,您可以使用各种 CSV NPM 包通过 NodeJS 从您的活动目录中读取和写入。

NodeJS 的 I/O 是非阻塞的,因此您实际上并没有阻塞 EventLoop。您可以处理多个 I/O 请求,因为 NodeJS 将为每个请求创建线程,并在主线程上继续执行,直到 I/O 操作完成并将数据发送回其函数引用,将它们作为函数添加到调用堆栈并从这些函数的引用中恢复程序执行。获得 I/O 数据后,只需通过响应对象将其发送回客户端即可。应该不需要计时器。

那么问题是一旦 powershell 脚本运行,您必须等待初始脚本完成才能处理挂起的请求吗?我还是有点不清楚...


推荐阅读