[英]AWS Lambda Node.js Environment Failed to Loop Insert to Mysql on First API Call
[英]AWS Lambda/API Gateway - Pass an ID to delete a row in mysql with node.js
我在 Node.js 中為不同的 HTTP 請求編寫了一個簡單的 Restful API,然后我嘗試使用 Lambda 函數來實現。 我在 Lambda 中使用 DELETE 語句的問題是我不知道如何通過 API 網關傳遞 ID 以刪除 mysql 表中的某一行。
使用 node.js,我只是通過 URL 的路由(例如 /contacts/:id)定義它,然后使用 .params.id 訪問它。 您將如何為同一路由 (/contacts) 傳遞一個值(ID),然后在下面的處理程序中使用它來刪除具有該特定 ID 的行?
當您使用 --data 在本地調用它時,我在下面發布的代碼可以正常工作,例如:
serverless invoke local --function delete --data "2"
如果我通過 testdata { "id": "1" } 並使用 event.id 而不是 event,那么如果我部署 lambda,同樣的代碼也可以工作。
我意識到這不是你做的方式,但我終於用完了想法並決定在這里發布我的問題。 :-) 那么,我如何通過 api 網關將帶有 DELETE HTTP 請求的 ID 傳遞到 /contacts 並在 mysql 查詢中使用它?
module.exports.handler = (event, context, callback) =>
{
const mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
// Use the connection
connection.query('DELETE FROM sqllambdadb.contacts WHERE id=?', event, function (err, res) {
if (err) throw err;
else if (res.affectedRows>0) callback(err, 'EMail with ID: '+ event+ ' deleted!');
else callback(err, 'No row with ID: '+ event+ ' found!');
});
connection.end();
};
API Gateway 將請求映射到輸入事件對象
{
"resource": "Resource path",
"path": "Path parameter",
"httpMethod": "Incoming request's method name"
"headers": {Incoming request headers}
"queryStringParameters": {query string parameters }
"pathParameters": {path parameters}
"stageVariables": {Applicable stage variables}
"requestContext": {Request context, including authorizer-returned key-value pairs}
"body": "A JSON string of the request payload."
"isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}
在您的示例中,根據您使用的段別名,您可以通過解構適當的事件對象或直接通過event.pathParameters.id
引用來訪問 id
const mysql = require('mysql');
module.exports.handler = (event, context, callback) => {
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
//Destructing id from event.pathParameters object
var {id} = event.pathParameters
// Use the connection
connection.query('DELETE FROM sqllambdadb.contacts WHERE id=?', id, function (err, res) {
if (err) throw err;
else if (res.affectedRows>0) callback(err, 'EMail with ID: '+ id + ' deleted!');
else callback(err, 'No row with ID: '+ id + ' found!');
});
connection.end();
};
因此,我設置了 yaml 以將參數值添加到我的 URL:
delete:
handler: src/delete.handler
package:
include:
- node_modules/**
- src/delete.js
- serverlessAPI.iml
events:
- http:
path: contact-management/contacts/{id}
method: delete
cors: true
integration: LAMBDA
request:
parameters:
paths:
id: true
使用此配置,id 將直接保存在 event.id 下的事件對象中,因此您可以像這樣簡單地訪問它:
module.exports.handler = (event, context, callback) =>{
const mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'testt123'
});
var id = event.id;
// Use the connection
connection.query('DELETE FROM sqllambdadb.Contacts WHERE id=?', id, function (err, res) {
if (err) throw err;
else if (res.affectedRows>0) callback(err, 'EMail with ID: '+ id + ' deleted!');
else callback(err, 'No row with ID: '+ id + ' found!');
});
connection.end();
};
您可以通過使用以下輸入創建測試用例來測試它:
{
"id": "$input.params('id')"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.