使用 emitters/listeners 处理多个 POST 请求
Process multiple POST requests with emitters/listeners
代码:
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
emitter.on('response', function (output) {
res.status(200).json({ip: `${output}`, id: `${random_id}`});
});
});
问题:
我现在遇到的问题(我正在使用 express
)是我无法向该应用发出多个请求。第一次表达returns期望值,之后每次表达:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
应用程序的其余部分是由事件发射器和侦听器触发的函数集合。将其视为一串发射器触发侦听器并连续执行 4 或 5 个函数,最后返回一个值。
这是第一次完美运行,但再也没有了。请注意,请求应该来自不同的机器,而不是一台机器。
我知道 res.end()
会结束响应,但 Express 函数的组合无法使其第二次工作。有没有办法用emitters/listeners和表达回复?
提前致谢!
编辑:更多代码
emitter.on('newRequest', persistentDisk);
emitter.on('newDisk', persistentDisk);
emitter.on('newDeployment', newDeployment);
emitter.on('newService', createService);
emitter.on('checkDeployment', checkDeployment);
emitter.on('returnIp', returnIp);
emitter.on('deleteRequest', deleteApp);
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
var random_id = randomize('a', 8);
var user_id = req.body.user_id;
var stripe_id = req.body.stripe_id;
var app_name = req.body.app_name;
var gpu_count = req.body.gpu_count;
var cpu_count = req.body.cpu_count;
var memory_count = req.body.memory_count;
emitter.emit('newRequest', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
emitter.on('response', function (output) {
res.send({ip: `${output}`, id: `${random_id}`});
});
async function persistentDisk(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
emitter.emit('newDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
emitter.emit('newService', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function newDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var deployConfig = JSON.parse(`...`);
emitter.emit('checkDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function createService(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var exposeConfig = JSON.parse(`...`);
emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function checkDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function returnIp(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var service = JSON.parse(`{"ip":"127.0.0.1"}`)
jq.run('.ip', service, { input: 'json' }).then((output) => {
emitter.emit('response', output)
if (output.toString() === "null") {
setInterval(() => {
console.log('value is null');
emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
}, 15000);
}
});
} catch (err) {
console.log(err);
errors.report(err);
}
}
这会在第一时间产生响应(127.0.0.1
,重要的是)。
更改为:
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
emitter.once('response', function (output) {
res.status(200).json({ip: `${output}`, id: `${random_id}`});
});
});
(从 emitter.on 到 emitter.once)解决了问题。
代码:
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
emitter.on('response', function (output) {
res.status(200).json({ip: `${output}`, id: `${random_id}`});
});
});
问题:
我现在遇到的问题(我正在使用 express
)是我无法向该应用发出多个请求。第一次表达returns期望值,之后每次表达:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
应用程序的其余部分是由事件发射器和侦听器触发的函数集合。将其视为一串发射器触发侦听器并连续执行 4 或 5 个函数,最后返回一个值。
这是第一次完美运行,但再也没有了。请注意,请求应该来自不同的机器,而不是一台机器。
我知道 res.end()
会结束响应,但 Express 函数的组合无法使其第二次工作。有没有办法用emitters/listeners和表达回复?
提前致谢!
编辑:更多代码
emitter.on('newRequest', persistentDisk);
emitter.on('newDisk', persistentDisk);
emitter.on('newDeployment', newDeployment);
emitter.on('newService', createService);
emitter.on('checkDeployment', checkDeployment);
emitter.on('returnIp', returnIp);
emitter.on('deleteRequest', deleteApp);
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
var random_id = randomize('a', 8);
var user_id = req.body.user_id;
var stripe_id = req.body.stripe_id;
var app_name = req.body.app_name;
var gpu_count = req.body.gpu_count;
var cpu_count = req.body.cpu_count;
var memory_count = req.body.memory_count;
emitter.emit('newRequest', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
emitter.on('response', function (output) {
res.send({ip: `${output}`, id: `${random_id}`});
});
async function persistentDisk(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
emitter.emit('newDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
emitter.emit('newService', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function newDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var deployConfig = JSON.parse(`...`);
emitter.emit('checkDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function createService(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var exposeConfig = JSON.parse(`...`);
emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function checkDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
} catch (err) {
console.log(err);
errors.report(err);
}
}
async function returnIp(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
try {
var service = JSON.parse(`{"ip":"127.0.0.1"}`)
jq.run('.ip', service, { input: 'json' }).then((output) => {
emitter.emit('response', output)
if (output.toString() === "null") {
setInterval(() => {
console.log('value is null');
emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
}, 15000);
}
});
} catch (err) {
console.log(err);
errors.report(err);
}
}
这会在第一时间产生响应(127.0.0.1
,重要的是)。
更改为:
app.post('/new', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400);
emitter.once('response', function (output) {
res.status(200).json({ip: `${output}`, id: `${random_id}`});
});
});
(从 emitter.on 到 emitter.once)解决了问题。