我正在使用Knex.js将数组中的值插入PostgreSQL数据库中。我一直遇到的问题是,在数据库中插入行后,Knex将挂起。
我已经为此苦苦挣扎了几个小时,并尝试了各种解决方案,包括Get Knex.js transactions working with ES7 async/await,Make KnexJS Transactions work with async/await和Knex Transaction with Promises。
不管我尝试哪种口味,我都会回到死胡同。我很确定自己缺少明显的东西,但是可能我没有喝咖啡。
这是我的测试代码:
const testArray = [
{line: 'Canterbury Tales'},
{line: 'Moby Dick'},
{line: 'Hamlet'}
];
const insertData = (dataArray) => {
return new Promise( (resolve, reject) => {
const data = dataArray.map(x => {
return {
file_line: x.line
};
});
let insertedRows;
db.insert(data)
.into('file_import')
.then((result) => {
insertedRows = result.rowCount;
resolve(insertedRows);
})
});
}
const testCall = (b) => {
insertData(b).then((result) => {
console.log(`${result} rows inserted.`);
})
}
testCall(testArray);
这将返回以下内容:
3 rows inserted.
编辑:使用解决方案更新
感谢@sigmus,我可以通过添加db.destroy()
使此工作正常。这是功能齐全的更新代码块:
const testArray = [
{line: 'Canterbury Tales'},
{line: 'Moby Dick'},
{line: 'Hamlet'}
];
const insertData = (dataArray) => {
return new Promise( (resolve, reject) => {
const data = dataArray.map(x => {
return {
file_line: x.line
};
});
let insertedRows;
db.insert(data)
.into('file_import')
.then((result) => {
insertedRows = result.rowCount;
resolve(insertedRows);
})
.finally(() => {
db.destroy();
});
});
}
const testCall = (b) => {
insertData(b).then((result) => {
console.log(`${result} rows inserted.`);
process.exit(0);
})
}
testCall(testArray);
答案 0 :(得分:1)
如果您在process.exit(0);
之后添加console.log(`${result} rows inserted.`);
,则脚本应退出。
可能是连接池问题,请尝试使用destroy
,如此处所述:https://knexjs.org/#Installation-pooling