gpt4 book ai didi

javascript - 我不明白为什么我的快速路由在发送后遇到 'can' t set headers'

转载 作者:行者123 更新时间:2023-12-01 02:21:08 25 4
gpt4 key购买 nike

我正在尝试制作一个机器学习项目(整数序列预测器)。 ML 代码是一个 Python 脚本。我正在尝试制定一条快速路线来处理 python 脚本的 stdin 和 stdout 并根据该路线发送响应。

我在应用程序启动时生成 python 脚本。

let p = spawn('python', ['python/script.py'], { stdio: ['pipe', 'pipe', process.stderr] });

我的路线

router.get('/', managePredictor);

管理预测器

    function managePredictor(req, res, next) {
try {
//timestamp
let ts = new Date().getTime();
let token = ts + '_' + magic();
let seq = req.query.seq;
let re = new RegExp(token + '((?:\\s|\\S)*)' + token);
p.stdin.write(token + '\n' + seq + '\n');
p.stdout.resume();
p.stdout.on('data', (chunk) => {
str += chunk;
let s = re.exec(str);
let o = JSON.parse(s[1].trim());
p.stdout.pause();
res.send(o);
});
}
catch (err) {
res.status(500).send('Internal Server Error');
}
}

token 是一个类似于 1520661269162_YGo6p3 的字符串。

对于路线的第一个请求,但对于任何连续请求,错误如下

>Error: Can't set headers after they are sent.
> at validateHeader (_http_outgoing.js:494:11)
> at ServerResponse.setHeader (_http_outgoing.js:501:3)
> at ServerResponse.header (D:\mlproj\node_modules\express
>lib\response.js:730:10)
> at ServerResponse.send (D:\mlproj\node_modules\express >\lib\response.js:170:12)
> at ServerResponse.json (D:\mlproj\node_modules\express >\lib\response.js:256:15)
> at ServerResponse.send (D:\mlproj\node_modules\express >\lib\response.js:158:21)
at Socket.p.stdout.on (D:\mlproj\routes\predict.js:39:11)
at emitOne (events.js:121:20)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)

Python脚本的IO片段

while True:
ts = input()
inp = input()
arr = inp.split(" ")
arr = list(map(lambda x: int(x), arr))
qq = findNextn(arr, 5)
print(ts)
out = json.dumps({'orignal': arr, 'predicted':qq}, indent=4)
print(out)
print(ts)

最佳答案

p.stdout.on('data', (chunk) => {
...
res.send(o);

每次收到一大块数据时,您都会尝试发送响应。

因此,请求到达后第一次获取数据 block 时,您会发送响应。

然后,当您下次获得一大块数据时,您会尝试再次发送响应。您不能这样做,因为它已经发送了。

<小时/>

您需要重新考虑如何处理 HTTP 请求与 Python 程序中的数据之间的交互。

每次从 Python 进程获取数据 block 时,您可能应该将数据存储在字符串中,然后使用该字符串的当前内容响应 HTTP 请求(同时将其重置回空字符串)。

关于javascript - 我不明白为什么我的快速路由在发送后遇到 'can' t set headers',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49206496/

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