我正在尝试使用后请求通过云功能将数据插入到扳手中。我认为我正在按照文档中的说明进行所有操作,但我不明白是什么原因导致下一个错误:
"Error: 1 session leak(s) detected.
at _requests.onIdle.then (/srv/node_modules/@google-cloud/spanner/build/src/session-pool.js:193:25)
at <anonymous>"
还有我的云功能
const {Spanner} = require('@google-cloud/spanner');
module.exports.http = (req, res) => {
const projectId = 'project-id';
const instanceId = 'instance-id';
const databaseId = 'database-id';
const spanner = new Spanner({
projectId: projectId,
});
const instance = spanner.instance(instanceId);
const database = instance.database(databaseId);
let sqlResponse = "";
database.runTransaction(async (err, transaction) => {
if (err) {
res.status(500).send(JSON.stringify({message: err, requestBody: req.body}));
return;
}
try {
const data = req.body;
const [rowCount] = await transaction.runUpdate({
sql:
'INSERT Feedbacks (age, comment, gender, rating) VALUES (@age, @comment, @gender, @rating)',
params: {
age: data.age.toString(),
comment: data.comment,
gender: data.gender,
rating: data.rating.toString(),
},
});
sqlResponse = 'Successfully inserted ' + rowCount + ' record into the Feedbacks table.';
await transaction.commit();
res.status(200).send(JSON.stringify({message: sqlResponse, requestBody: req.body}));
} catch (err) {
res.status(500).send(JSON.stringify({message: err, requestBody: req.body}));
} finally {
database.close();
}
});
};
答案 0 :(得分:2)
您的代码似乎正确。正如@Mayeru在对问题的评论中指出的那样,首先要确认的是,您要插入一条新记录,该记录具有为表的primary key列指定的唯一值。
另一个可能导致您遇到的问题的可能性是,您正在尝试使用Cloud Console的“ Cloud Functions”>“ Function details”部分的“ Testing” UI来测试该功能。如果是这样,那么当您单击“测试功能”按钮时,您可能使用的是空的请求正文或格式错误的请求正文。在“测试功能”按钮上方显示的“触发事件”文本区域中,确保输入了有效的JSON请求正文,其中包括INSERT语句期望的元素和值。
例如,如下所示的“触发事件” JSON请求正文应起作用:
{"singerId":"1001","firstName":"Test","lastName":"Singer"}
使用以下与共享代码相似的“ nodeInsert”函数:
const {Spanner} = require('@google-cloud/spanner');
module.exports.nodeInsert = (req, res) => {
const projectId = 'my-project';
const instanceId = 'my-instance';
const databaseId = 'my-database';
const spanner = new Spanner({
projectId: projectId,
});
const instance = spanner.instance(instanceId);
const database = instance.database(databaseId);
let sqlResponse = "";
database.runTransaction(async (err, transaction) => {
if (err) {
res
.status(500)
.send(JSON.stringify({message: err, requestBody: req.body}));
transaction.end();
console.error('Transaction terminated.');
return;
}
try {
const data = req.body;
const parsedSingerId = parseInt(data.singerId, 10);
const [rowCount] = await transaction.runUpdate({
sql:
'INSERT Singers (SingerId, FirstName, LastName) VALUES (@singerId, @firstName, @lastName)',
params: {
singerId: parsedSingerId,
firstName: data.firstName,
lastName: data.lastName,
},
});
sqlResponse = 'Successfully inserted ' + rowCount + ' record into the Singers table.';
await transaction.commit();
res
.status(200)
.send(JSON.stringify({message: sqlResponse, requestBody: req.body}));
} catch (err) {
res
.status(500)
.send(JSON.stringify({message: err, requestBody: req.body}));
transaction.end();
console.error('Transaction terminated.');
} finally {
database.close();
}
});
};