【发布时间】:2023-03-15 12:16:01
【问题描述】:
因此,我查看了具有相同错误的其他答案,但他们的解决方案都没有回答我的问题。
我有一个 mysql 表,其中有大约 10k 个名称,并且我有一个 nodejs 文件的 25 个实例(侦听不同的端口),每个实例都发送请求以通过 php 文件从数据库中获取 400 个名称。如果我将请求设置为像 100 - 150 一样抓取它工作,但如果我告诉它获取超过 200,我会收到错误输入意外结束”。
这是我的 nodejs 请求:
function user_acquire()
{
var request = require('request');
var http = require('http');
var post_options = {
host: 'localhost',
path: '/name_request.php?pos1=50&pos2=150', //this is where the amount to request is set & range
method: 'POST',
headers: {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded',
}
};
// Set up the request
var post_req = http.request(post_options, function (res) {
res.on('data', function (chunk) {
usernames = JSON.parse(chunk);
});
});
post_req.end();
}
这是 nodejs 与之通信的 php 文件:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname, '3306');
if ($conn->connect_error)
{
die("Connection failed: " . $conn->connect_error);
}
$start = $_GET['pos1'];
$end = $_GET['pos2'];
$sql = mysqli_query($conn, "SELECT * FROM preliminary_tests WHERE ID BETWEEN '$start' AND '$end'");
$array = mysqli_fetch_all($sql, MYSQLI_ASSOC);
print_r(json_encode($array,JSON_UNESCAPED_UNICODE));
?>
使用JSON_UNESCAPED_UNICODE并不能解决问题。我知道 mysql 编码为utf-8。 这两个函数都适用于较小的请求,但增加请求大小会破坏一个,我不知道为什么
【问题讨论】:
-
也许在 200 个用户名之后响应变得太大并且在发送到节点时被分成多个块。看起来您正在解析到达时的每个块,但该块可能会过早地切断 JSON,这就是您收到错误的原因。您应该能够在到达响应的“数据”事件时附加每个块,并在响应以它的“结束”事件结束时解析它们。
-
@Stiliyan 你如何建议我通过数据事件附加它们,我有一个粗略的想法?
-
您应该能够通过在
res.on('data')回调上方声明var usernames = "";来使用闭包。usernames现在将在“数据”回调的范围内,您可以在其中附加传入的块usernames += chunk;。然后,监听响应的结束事件,并在其回调中解析用户名。比如:res.on("end", function() { usernames = JSON.parse(usernames);}) -
@Stiliyan 你是这个意思吗?
var post_req = http.request(post_options, function (res) { var usernames= " "; res.on("end", function () { usernames = JSON.parse(usernames); }); }); -
您需要数据和结束回调。我决定把我的 cmets 变成一个答案。希望它有用,祝你好运!