【发布时间】:2019-01-09 11:11:38
【问题描述】:
当我在 nodejs 中尝试使用 promise.all 进行批量查询时,在一些查询成功后出现 ECONNREFUSED 错误。
我正在为我的 Web 应用程序构建节点服务器。我做了一些来自客户端的 AJAX 请求的查询。到目前为止,他们都工作得很好。
我尝试将数据从 excel 加载到一些表中(我使用 pg 模块)。我写了一个代码,如果没有相同的记录,则在读取后插入记录。我使用 promise 进行查询。但它进行了一些查询,然后开始出现 ECONNREFUSED 错误。
- 我已将 max_connections 更改为 10000,将 shared_buffers 更改为 25000MB。并重启 postgres 服务器
- 我已将 max_connections 更改为 1000,将 shared_buffers 更改为 2500MB。然后重新启动 postgres 服务器
- 我已将 max_connections 更改为 300,将 shared_buffers 更改为 2500MB。并重启 postgres 服务器
- 我已将代码从 POSTGRESQL 池更改为 POSTGRESQL 客户端
我在 promise 数组中省略了一些查询
但没有任何改变。总共插入了近 180 条记录。然后就报错了。
function loadData(auditArrayObject){
return new Promise(function (resolve, reject) {
let promises=[
loadAuditItem(auditArrayObject.audit,
auditArrayObject.auditVersion),
loadProcesses(auditArrayObject.processArray),
loadControlAims(auditArrayObject.controlAimArray),
loadCriterias(auditArrayObject.criteriaArray),
loadParameters(auditArrayObject.parameterArray),
]
Promise.all(promises)
.then(objectsWithId=>{
......
}
}
function loadProcesses(processArray){
return new Promise(function (resolve, reject) {
let promises=[];
for(let i=0;i<processArray.length;i++){
let process= new Process(null,processArray[i],false)
let promise= postGreAPI.readProcessByName(process.name)
.then(resultProcess=>{
if (!resultProcess) {
postGreAPI.createProcess(process)
.then(createdProcess=>{
resolve(createdProcess)
})
.catch(err=>{
reject({msg:"createProcess
hata aldı",err:err})
})
} else {
return (resultProcess)
}
})
.catch(err=>{
reject({msg:"readProcessByName
hata aldı",err:err})
})
promises.push(promise)
}
Promise.all(promises)
.then(processArray=>{
resolve({key:"Process",value:processArray})
})
.catch(err=>{
reject({msg:"Processlerden birisi insert edilemedi",err:err})
})
});
}
postGreAPI.readProcessByName:
var readProcessByName = function (name){
return new Promise(function (resolve, reject) {
let convertedName=convertApostrophe(name)
let query = "SELECT * FROM process WHERE name='"
+ convertedName + "'"
queryDb(query)
.then(result=>{
if (result.rows.length>0){
let process = new Process(result.rows[0].id,
result.rows[0].name,
result.rows[0].isactive);
resolve(process)
}else{
resolve(null)
}
})
.catch(err=>{
reject(err)
})
})
}
queryDb:
var queryDb2 = function (query,params) {
return new Promise(function (resolve, reject) {
let pool = new PostGre.Pool(clientConfig);
pool.connect(function(err, client, done) {
if(err) {
return reject (err);
}
client.query(query,params, function(err, result) {
done();
if(err) {
return reject (err);
}
resolve(result)
});
});
})
}
错误是:
Error: connect ECONNREFUSED 127.0.0.1:5432
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1113:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 5432 }
实际上,在我的笔记本电脑配置更改之前,我已经成功加载。之前有 Windows 7,但现在有 Windows 10。
【问题讨论】:
-
您是否可能为每一行创建一个新连接,然后立即再次关闭它?在这种情况下,这可能是一个 Windows 问题:Windows 将关闭的端口保持打开(保留?)一段时间。因此,如果您不断(并且快速)打开和关闭连接,这可能意味着 Windows 会耗尽(客户端)端口。您能否将代码重构为仅在整个过程中打开并使用 single 连接? (顺便说一句:它是 Postgres 或 PostgreSQL,但 not "postGre")
-
回答问题。似乎是固定的。当我为整个过程创建一次池时。
标签: node.js postgresql pool econnrefused pg-node