如果没有查询参数,我希望函数返回表中所有内容的列表,如果参数id存在,则返回一行。
var mysql = require('mysql');
var config = require('./config.json');
var pool = mysql.createPool({
host : config.host,
user : config.user,
password : config.password,
database : config.database
});
exports.handler = (event, context, callback) => {
var whereClause
if(event.queryStringParameters.id !== null){
let id = event.queryStringParameters.id
whereClause = ' where id='+id
}
context.callbackWaitsForEmptyEventLoop = false;
pool.getConnection(function(err, connection) {
// Use the connection
connection.query('SELECT * from users'+whereClause, function (error, results, fields) {
// And done with the connection.
connection.release();
// Handle error after the release.
if (err) callback(err);
else {
var response = {
"statusCode": 200,
"headers": {
"my_header": "my_value"
},
"body": JSON.stringify(results),
"isBase64Encoded": false
};
callback(null, response);
}
});
});
};
当不存在带有错误的查询参数时,该函数将失败
“无法读取null的属性'id'”
那是为什么?
答案 0 :(得分:1)
您没有提供任何行号信息或堆栈跟踪,因此我猜测if语句失败是因为event.queryStringParameters
为空:
if(event.queryStringParameters.id !== null)
let id = event.queryStringParameters.id
whereClause = ' where id='+id
}
您应该写:
if (event.queryStringParameters && event.queryStringParameters.id !== null) {
let id = event.queryStringParameters.id;
whereClause = ' where id=' + id;
}
话虽如此,您应该不使用字符串连接将用户提供的值(例如id
)注入SQL查询中。这使您容易受到SQL Injection攻击。以下是有关如何更安全地编写此代码的想法:How to prevent SQL Injection in Node.js
答案 1 :(得分:0)
您是否将AWS Lambda与Amazon API Gateway一起使用? AWS Lambda with Amazon API Gateway
在这种情况下:
确保在API网关中创建主体映射模板(集成请求->主体映射模板)。作为示例,下面是一个人体映射模板,该模板将查询参数电子邮件传递给您的lambda函数:{“ id”:“ $ input.params('id')”}