我有一个数据迁移器,当将数据从SQL Server迁移到Mongo时,它获取生成的ID并通过插入生成的ID更新SQL表。显示的错误是“ RequestError:只能在LoggedIn状态下进行请求,而不能在SentClientRequest状态下进行”。在我看来,它试图执行更新请求而不完成前一个请求。 (请记住,一次必须发出多个请求)
我尝试了connection.on('doneInProc')事件,但我不太了解此事件的工作原理
function updateSql(cliente) {
console.log("ATUALIZANDO SQL...")
console.log("Entrou")
request = new Request(`update tbLekkus_Cliente set customerId = '${cliente._id}' where codCliente = ${lastCodCliente}`, function(err) {
if (err) {
console.log("erro: >>>", err)
} else {
console.log("foi")
}
})
connection.execSql(request);
request.on('doneInProc', function(rowCount, more, returnStatus, rows) {
return
});
}
function updateMongo(cliente) {
if (cliente.action === 'add') {
db.collection("TesteCollection").insertOne(cliente, { writeConcern: { w: 2, j: true, wtimeout: 10000 } });
updateSql(cliente)
} else {
try {
let id = cliente._id
delete cliente._id
db.collection("TesteCollection").updateOne(id, cliente);
} catch (e) {
console.log('Erro no update aqui', e)
return
}
}
}
我需要通过一次将所有生成的ID一次插入到所有输入的记录中来更新SQL Server
答案 0 :(得分:0)
您的SQL客户端库很可能从其execSql调用返回一个Promise,在这种情况下,您可以使用async / await来实现所需的目标,像这样:
// NOTE the addition of the async keyword to the function signature
async function updateSql(cliente) {
console.log("ATUALIZANDO SQL...")
console.log("Entrou")
request = new Request(`update tbLekkus_Cliente set customerId = '${cliente._id}' where codCliente = ${lastCodCliente}`, function(err) {
if (err) {
console.log("erro: >>>", err)
} else {
console.log("foi")
}
})
await connection.execSql(request);
// Won't reach this line until the above has completed
// Can also be replaced with 'return connection.execSql(request);'
// but will still require you to resolve updateSql as a promise in the calling function
}
但是,请注意,这也使您的updateSql函数返回一个promise,因此,调用它的任何人都需要通过在另一个异步函数中等待它或通过resolving it as a promise来对其进行处理。