【发布时间】:2018-05-11 19:00:32
【问题描述】:
我需要“Nodejs”和“无服务”。我创建了一个“无服务器”API 并部署到 AWS。一切都按预期工作。我遇到的问题是,我似乎找不到任何关于此的信息,每第二次调用我都会收到内部服务器错误。第一个调用是,按预期返回数据。
我仅在开发阶段部署到 AWS。我想知道我是否缺少某些配置或什么?
如果您需要我可以提供的“无服务器”配置或代码示例。
谢谢。
回答
我认为数据库调用没有及时返回数据以进行回调存在问题,因此我发现结果不一致。
所以基本上我所做的就是创建一个返回 Promise 的数据库类......
'use strict';
const mysql = require('mysql');
/**
* Database
*/
class Database {
constructor(config) {
if (!this.dbConnection) {
console.log('connect to DB');
this.dbConnection = mysql.createPool(config);
this.dbConnection.on('connection', (connection) => {
console.info('Connection Made!');
});
}
}
query(sql, args) {
return new Promise((resolve, reject) => {
this.dbConnection.query(sql, args, (err, rows) => {
if (err) {
reject(err);
}
resolve(rows);
})
});
}
close() {
return new Promise((resolve, reject) => {
this.dbConnection.end((error) => {
if (error) {
reject(error);
}
resolve();
});
});
}
}
module.exports = Database;
所以当我进行查询时,有一个结果准备好回调。
'use strict';
const Database = require('./lib/Database');
const {successResponse, errorResponse} = require('./lib/response');
const CategoryResource = require('./resource/Category');
module.exports.list = (event, context, callback) => {
let sql = 'SELECT * FROM categories AS c WHERE c.company_id = ? AND c.parent_id IS NULL AND c.status = 1 LIMIT ?, ?;';
const company = parseInt(event.queryStringParameters.company);
let page = 1;
let limit = 20;
if (null != event.queryStringParameters) {
if ('page' in event.queryStringParameters) {
page = parseInt(event.queryStringParameters.page);
}
if ('limit' in event.queryStringParameters) {
limit = parseInt(event.queryStringParameters.limit);
}
}
let start = (page - 1) * limit;
if (isNaN(company)) {
callback(null, errorResponse(400, 'Company ID Required', 'Parameter company_id is required.', []));
return;
}
let Category = new Database();
let categoryResource = [];
Category
.query(sql, [company, start, limit])
.then(response => {
Category.close();
response.forEach((category) => {
categoryResource.push(CategoryResource(category));
});
callback(null, successResponse(200, {
"total": response.length,
"perPage": limit,
"currentPage": page,
"data": categoryResource
}));
})
.catch((error) => {
callback(null, errorResponse(error.code, error.sqlMessage, error.sql, {
code: error.errno,
field: error.sqlMessage,
message: error.sqlMessage
}));
Category.close();
});
};
我希望这对可能遇到相同问题的任何人有所帮助。
【问题讨论】:
-
内部服务器错误意味着您的代码存在问题。没有示例就无法进一步提供帮助。
标签: amazon-web-services aws-lambda aws-api-gateway serverless-framework serverless