通过node.js传递id以删除mysql中的一行

o4tp2gmn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(265)

我在node.js中为不同的http请求编写了一个简单的restfulapi,然后尝试用lambda函数实现。lambda中delete语句的问题是我不知道如何通过api网关传递id来删除mysql表中的某一行。
对于node.js,我只是通过url的路径(例如/contacts/:id)来定义它,然后用.params.id访问它。如何为同一路由(/contacts)传递一个a值(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();
    };
xtupzzrd

xtupzzrd1#

api网关将请求Map到输入事件对象

{
    "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"
}

在您的示例中,根据您使用的segement的别名,您可以通过对适当的事件对象进行分解或通过直接引用来访问id event.pathParameters.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();
};

nwo49xxi

nwo49xxi2#

因此,我设置了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下的event对象中,因此您可以像这样简单地访问它:

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();
};

您可以通过使用以下输入创建testcase来测试它:

{
  "id": "$input.params('id')"
}

相关问题