【发布时间】:2019-03-20 18:47:12
【问题描述】:
我正在 github 上开发一个名为 lan-info 的项目。
我有以下代码
let arpSweepCommand = './arpSweep.sh';
app.get('/arp', (req, res) => {
console.log('we have a working signal!');
executeCommand(arpSweepCommand, req, res, false);
fs.readFile('command_output/arpedHosts.txt', 'utf-8', (error, data) => {
if (error) {
res.send(error);
} else {
res.send(data);
}
})
})
并且 arpSweep.sh 包含:
timeout 10s netdiscover -P > command_output/arpedHosts.txt
在我的前端我有一个 Jquery AJAX 调用:
arpButton.click(function () {
loader.show();
$.ajax({
method: 'GET',
url: '/arp',
success: function (data) {
console.log(data);
commandOutput.append(data);
loader.hide();
}
})
})
我知道没有语法错误,因为 webpack 编译前端代码没有任何抱怨;而且我知道后端确实捕获了请求,因为每当我单击arpButton 时,它都会打印“我们有信号!”在服务器上。
但问题是 loader.show()/hide() 似乎只在这个 ajax 请求中什么都不做我知道这是特定于这个 ajax 请求的,因为我有类似的请求可以完美运行。
我的问题是信息不会自动附加到commandOutput。
我需要再次单击arpButton,以便将输出附加到commandOutput。
但是加载程序不会为我显示我知道加载程序不会很快出现和消失,因为 ajax 调用至少需要 10 秒才能完成。
另一个问题是commandOutput 10 秒后数据没有自动出现我在点击arpButton 后等待30 分钟测试了只有装载机出现故障,但没有任何反应;当我继续单击arpButton 时,输出会立即显示。
那么为什么页面不更新自身呢?相反,它迫使我重新单击该按钮。
如果您需要更多信息,可以单击文件上方的项目链接:
src/index.js
index.js
arpSweep.sh
注意:如果 index.js 顶部的子网不是您使用的子网,请务必更改它(自动子网检测是我计划稍后实现的功能)。
编辑:在尝试读取文件作为executeCommand的回调之后:
function executeCommand (command, req, res, sendRes = true, callback) {
exec(command, (error, stdout, stderr) => {
console.log(`stdout: ${stdout}`)
console.log(`stderr: ${stderr}`)
if (error !== null) {
console.log(`Error ${error}`)
} else if (sendRes === false) {
} else if (typeof callback === 'function') {
callback()
} else {
res.send(stdout + stderr)
}
})
}
app.get('/arp', (req, res) => {
console.log('we have a working signal!')
executeCommand(arpSweepCommand, req, res, false, function () {
fs.readFile('command_output/arpedHosts.txt', 'utf-8', (error, data) => {
if (error !== null) {
res.send(error)
} else {
res.send(data)
}
})
})
})
我遇到了一个新问题:
现在单击arpButton 时,加载程序出现,但在10 秒后(在netdiscover 被杀死之前分配给arpSweep.sh 中的命令的时间)似乎没有任何区别,并且加载程序现在似乎永远停留在那里。
在服务器上我发现了以下错误。
error: Error can't execute command './arpSweep.sh'
【问题讨论】:
-
对不起,我真的不明白你的问题,需要更多信息来帮助,例如与“自动附加”相关的“这不是 ajax 的目的”是什么意思?当服务器上的执行完成并返回数据时,将调用您的
success方法,因此这正是您在倒数第二句中所说的似乎发现的错误。单击两次按钮似乎可以解决问题,但实际上可能是这样的:click button > script starts and takes 10 seconds > click again > script triggered by first click finishes and returns. -
在本地尝试了你的项目,我能说什么 - 加载器一切正常,当你发送带有空字符串的
ping时 - 加载器显示而不是隐藏,因为它永远不会成功(500 错误)当您执行arp时 - 加载程序几乎立即显示和隐藏,因为它在大约 5 毫秒内获得 200 OK。因此,如果您希望加载器在服务器上的某些工作正在进行时持续存在 - 您不应该立即返回响应。 -
@SaschaM78 但如果是这种情况,为什么加载程序不显示表明服务器端代码正在执行中
标签: javascript jquery node.js express