Lambda函数在10秒后超时

时间:2017-09-07 08:44:17

标签: node.js amazon-web-services lambda aws-lambda bookshelf.js

代码:

const knex = require('knex')({
    client: 'mysql',
    connection: {
        host: process.env.database_host,
        user: process.env.database_user,
        password: process.env.database_pass,
        database: process.env.database_db,
        charset: 'utf8'
    }
});
const bcrypt = require('bcrypt');
const bookshelf = require('bookshelf')(knex);
const User = bookshelf.Model.extend({
    tableName: 'users'
});

const checkValues = (values) => {
    // todo: add data validation
    return true;
};

exports.test = (database) => {
    // todo: add tests
};

exports.handler = (event, context, callback) => {
    let salt = bcrypt.genSaltSync();

    let values = {
        first_name: event.firstname,
        last_name: event.lastname,
        username: event.username,
        date_of_birth: event.birthday,
        password: bcrypt.hashSync(event.password, salt),
        password_salt: salt
    };

    if (!checkValues(values)) {
        callback(null, {
            success: false,
            error: {
                id: 2,
                details: 'data validation error'
            }
        });

        context.done(null, "User not created");

        return;
    }

    try {
        new User({
            'first_name': values.first_name,
            'last_name': values.last_name,
            'username': values.username,
            'date_of_birth': values.date_of_birth,
            'password': values.password,
            'password_salt': values.password_salt
        }).save();

        callback(null, {
            success: true
        });

        context.done(null, "User created");
    } catch (err) {
        console.log(err);

        callback(null, {
            success: false,
            error: {
                id: 1,
                details: 'error inserting user into database'
            }
        });

        context.done(null, "User not created");
    }
};

我正在尝试使用AWS API Gateway和Lambda函数创建一个基本注册api端点,但每次我将信息发布到api网关时都会收到错误

{
    "errorMessage": "2017-09-07T08:38:50.174Z f2368466-93a7-11e7-b4bc-01142a109ede Task timed out after 10.00 seconds"
}

我尝试过使用不同的数据库,但我似乎总是遇到同样的问题。数据库连接工作原理我知道这一点,因为用户确实将数据库中的users表添加到了并且密码已成功散列。

我也尝试过使用异步bcrypt,但它对结果没有任何影响,它仍然会这样做但是说它超时了。

Lambda似乎没有正确终止,有些东西让这个过程继续运行,我无法弄清楚什么,有什么想法?

1 个答案:

答案 0 :(得分:1)

我有类似的问题,使用API​​网关调用我的lambda。

API网关的默认超时为30秒。如果你的反应在30秒内没有准备就绪,你将会超时,尽管你的lambda仍会运行!

因此可能会尝试在30秒内恢复响应。如果没有从API调用一个lambda并立即返回响应,让第一个lambda调用你的第二个lambda,那将运行最多5分钟的时间。

由于