gpt4 book ai didi

javascript - 如果条件直接转到 else 总是在我的情况下在 Node js

转载 作者:搜寻专家 更新时间:2023-11-01 00:37:19 25 4
gpt4 key购买 nike

我正在计算进程列表,并基于进程计数器尝试执行某些操作,但如果条件直接转到 ELSE,则不管进程计数器如何。

我的代码:

var express = require('express');
var app = express();
//var sleep = require('sleep');
var counter = 0;

app.get('/', function (req, res) {
res.send(
'<form action="/server" method="POST">' +
' <input type="submit" name="server" value="Run Script" />' +
'</form>');
});

app.get('/counter', function (req, res) {
res.end("Process Counter = " + counter);
});

app.post('/server', function (req, res) {
var fork = require('child_process').fork;
var child = fork('./client');
counter++;

child.on("close", function () { counter --; });

if(counter > 2)
{
app.get('/m', function (req, res) {
res.end("Already multiple process running. = " + counter);
});
}
else
{
app.get('/m', function (req, res) {
res.end("Single or No process running currently = " + counter);
});
}

});

var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port

console.log("app listening at http://%s:%s", host, port)
})

我想在进程计数器达到 10 时暂停/休眠服务器,然后在前 10 个完成后处理下一个队列请求,因此尝试设置像 10、10、10 等插槽中进程的进程列表。我会尝试管理它一旦条件根据计数器正常工作。计数器似乎返回正确的计数。

最佳答案

您的代码几乎没有问题。所以我创建了一个简单的 client.js

function test() {
console.log("Running test");
setTimeout(test, 10000);
}

test();

这只不过是一个无限循环。然后我将 app 对象用于全局计数器

if (!app.counter)
app.counter = 0;

接下来你的帖子变成下面

app.post('/server', function (req, res) {

var fork = require('child_process').fork;
var child = fork('./client');
app.counter++;
child.on("close", function () {
app.counter--;
});

res.send(200, "Current Processes - " + app.counter);
});

而且你没有结束 POST 请求,所以我添加了 res.send(200, "Current Processes - "+ app.counter);

接下来 /m 端点更新如下

app.get('/m', function (req, res) {
if (app.counter > 2) {
res.end("Already multiple process running. = " + app.counter);
}
else {
res.end("Single or No process running currently = " + app.counter);
}
});

所以最后的代码如下

var express = require('express');
var app = express();
//var sleep = require('sleep');
if (!app.counter)
app.counter = 0;


app.get('/', function (req, res) {
res.send(
'<form action="/server" method="POST">' +
' <input type="submit" name="server" value="Run Script" />' +
'</form>');
});

app.get('/counter', function (req, res) {
res.end("Process Counter = " + app.counter);
});

app.get('/m', function (req, res) {
if (app.counter > 2) {
res.end("Already multiple process running. = " + app.counter);
}
else {
res.end("Single or No process running currently = " + app.counter);
}
});


app.post('/server', function (req, res) {

var fork = require('child_process').fork;
var child = fork('./client');
app.counter++;
child.on("close", function () {
app.counter--;
});

res.send(200, "Current Processes - " + app.counter);
});

var server = app.listen(8081, function () {
var host = server.address().address;
var port = server.address().port;

console.log("app listening at http://%s:%s", host, port)

});

如果你运行服务器,它现在可以正常工作了

$ curl -X POST http://127.0.0.1:8081/server
Current Processes - 1
$ curl -X POST http://127.0.0.1:8081/server
Current Processes - 2
$ curl -X POST http://127.0.0.1:8081/server
Current Processes - 3
$ curl -X POST http://127.0.0.1:8081/server
Current Processes - 4

/m端点

$ curl http://127.0.0.1:8081/m 
Already multiple process running. = 4

对此进行测试的一个关键是确保您不是使用调试启动脚本,而是运行它。如果您查看子进程 spawnArgs,您会发现它如下所示

spawnargs

我们的主进程开始于 /usr/local/bin/node --inspect-brk=54160 ..../test.js

所以 fork 尝试使用 --inspect-brk=54160 启动另一个进程,但是那个端口已经忙于我们的调试器并且不允许子进程运行。所以这就是你应该直接运行它而不是调试主要代码的原因

关于javascript - 如果条件直接转到 else 总是在我的情况下在 Node js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com