簡體   English   中英

AWS Lambda/API 網關 - 傳遞 ID 以使用 node.js 在 mysql 中刪除一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM