Ваш код кажется правильным.Как отметил @Mayeru в комментариях к вашему вопросу, первое, что нужно подтвердить, это то, что вы вставляете новую запись с уникальным значением, указанным для столбца, который является первичным ключом вашей таблицы столбца.
Другая возможность, которая может быть причиной проблемы, с которой вы столкнулись, заключается в том, что вы пытаетесь протестировать функцию с помощью пользовательского интерфейса «Тестирование» в облачных функциях Cloud Console> раздел «Сведения о функции».Если это так, то вы можете использовать пустое тело запроса или искаженное тело запроса, когда нажимаете кнопку «Проверить функцию».В текстовой области «Инициирующее событие», которая появляется над кнопкой «Проверить функцию», убедитесь, что вы ввели действительное тело запроса 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();
}
});
};