node.js - 成功完成后 AWS Lambda 函数超时
问题描述
我有一个可以成功运行的 lambda 函数。我能够在 S3 和另一个 FTP 服务器上创建一个文件。问题是即使在成功完成后也会超时。它只是没有完成执行。我可以从日志中看到大约需要 2 秒,指定的超时时间是 5 秒。如何让我的功能在完成后立即停止?这是完整的代码:
"use strict";
var config = require('./config/dev');
var sql = require("mssql");
var AWS = require('aws-sdk');
var PromiseFtp = require('promise-ftp');
var fs = require('fs');
const request = require('request');
exports.handler = (event, context, callback) => {
GetDataFromServer(event, context, callback);
};
function GetDataFromServer(event, context, callback) {
console.log("Fetching data from database...");
var keys = [], outputText = '';
sql.connect(config.db, err => {
if (err) {
console.log("Error while connecting database :- " + err);
return callback(true, 'Error in fetching records from database...');
}
else {
new sql.Request()
.input('ClientId', sql.Int, 469)
.execute('ForesightDailyDataPull', (err, result) => {
if (!err) {
//Create Text here and assign to "outputText"
CreateFileOnS3(outputText, event, context, callback);
}
else {
console.log('Error in fetching records from database...');
return callback(true, 'Error in fetching records from database...');
}
})
}
});
sql.on('error', err => {
console.log('Error in fetching records from database...');
return callback(true, 'Error in fetching records from database...');
})
}
function CreateFileOnS3(fileData, event, context, callback) {
const fileName = generateFileName();
console.log('Sending file to S3...');
const s3 = new AWS.S3(config.awsCredentials);
const params = {
Bucket: config.app.s3Bucket,
Key: fileName,
Body: fileData
};
s3.upload(params, function (s3Err, data) {
if (s3Err) {
console.log('There was an error creating file on S3');
return callback(true, 'There was an error creating file on S3');
}
else {
console.log(`File uploaded successfully at ${data.Location}`);
CreatefileOnFTP(fileData, fileName, event, context, callback);
}
});
}
function CreatefileOnFTP(fileData, fileName, event, context, callback) {
console.log('Sending file to FTP...');
var ftpObject = {
"fileData": fileData,
"fileName": fileName,
"ftpURL": config.ftpDetails.ftpProtocol + "://" + config.ftpDetails.host,
"ftpUserName": config.ftpDetails.user,
"ftpPassword": config.ftpDetails.password
};
request({
url: config.ftpUploadURL,
method: "POST",
json: true,
body: ftpObject
}, function (error, response, body) {
if (!error) {
console.log('File sent successfully to FTP server.');
return callback(null, 'File sent successfully to FTP...');
}
else {
console.log('An error occurred while sending file to FTP.');
return callback(true, 'Error in sending file to FTP...');
}
});
}
function generateFileName() {
var _d = new Date(),
y = _d.getFullYear(),
m = _d.getMonth() + 1,
d = _d.getDate();
return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d) + '.txt';
}
解决方案
sql.close()
您应该在函数完成后通过在操作解析后调用来关闭打开的 sql 连接。
function GetDataFromServer(event, context, callback) {
console.log("Fetching data from database...");
var keys = [], outputText = '';
sql.connect(config.db, err => {
if (err) {
console.log("Error while connecting database :- " + err);
return callback(true, 'Error in fetching records from database...');
}
else {
new sql.Request()
.input('ClientId', sql.Int, 469)
.execute('ForesightDailyDataPull', (err, result) => {
if (!err) {
//Create Text here and assign to "outputText"
CreateFileOnS3(outputText, event, context, callback);
sql.close() //HERE
}
else {
console.log('Error in fetching records from database...');
sql.close() //HERE
return callback(true, 'Error in fetching records from database...');
}
})
}
});
sql.on('error', err => {
console.log('Error in fetching records from database...');
sql.close() //HERE
return callback(true, 'Error in fetching records from database...');
})
}
推荐阅读
- reverse-engineering - __ctype_b 表及其用法
- java - 如何模拟接口默认方法 Java8/Mockito2
- c - MiniDumpWriteDump 另一个进程
- mysql - MySQL 在执行计划中显示索引,但并没有真正使用它
- ubuntu - 如何向 Google Cloud Compute Engine VM Linux 实例添加 SSH 密钥?
- ansible - Ansible/Junos_OS - 变量的返回不缩进
- java - 在 ByteArrayOutputStream 中搜索子字符串
- ios - 如何从 iOS 应用程序将日志发送到 CloudWatch?
- assembly - 如何在arm Assembly中乘以和除以奇数常数?
- javascript - Javascript Web Firebase 获取在本地运行但不在公共 IP 中运行的令牌