AWS上的无服务器框架-Post API提供内部服务器错误

时间:2018-12-17 16:01:32

标签: amazon-web-services aws-lambda serverless-framework

我的serverless.yml看起来像这样-

service: books-api-v1

provider:
  name: aws
  region: eu-west-1
  role: arn:aws:iam::298945683355:role/lambda-vpc-role
  runtime: nodejs8.10
  iamRoleStatements:
    - Effect: Allow
      Action:
        - "ec2:CreateNetworkInterface"
        - "ec2:DescribeNetworkInterfaces"
        - "ec2:DeleteNetworkInterface"
      Resource: "*"
functions:
  login:
    handler: api/controllers/authController.authenticate
    vpc: ${self:custom.vpc}
    events:
      - http:
          path: /v1/users/login
          method: post
          cors: true

实际的API函数看起来像这样-

'use strict';

var db          =   require('../../config/db'),
    crypt       =   require('../../helper/crypt.js'),
    jwt         =   require('jsonwebtoken');

exports.authenticate = function(event, context, callback) {

    console.log(JSON.parse(event.body));
    const data = IsJsonString(event.body) ? JSON.parse(event.body) : event.body;

    let myEmailBuff = new Buffer(process.env.EMAIL_ENCRYPTION_KEY);
    db.users.find({
        where:{
            username : crypt.encrypt(data.username)
        }
    }).then(function(user) {

        try {

            let res = {
                statusCode: 200,
                headers: { 
                    'Content-Type': 'application/json',
                    'Access-Control-Allow-Origin': '*',
                    'Access-Control-Allow-Credentials': true, 
                },
                body: JSON.stringify({
                    message:'ERROR!',
                    success: false
                })
            };

            if (!user) {
                res.body = JSON.stringify({
                    success: false, 
                    message: 'Authentication failed. User not found.',
                    authFail:true
                });
                //res.status(200).json({ success: false, message: 'Authentication failed. User not found.',authFail:true, });
            }else if (user) {
                // check if password matches
                if (crypt.decrypt(user.password) != data.password) {
                    res.body = JSON.stringify({
                        success: false, 
                        message: 'Authentication failed. Wrong password.',
                        authFail:true
                    });
                    //res.status(200).json({ success: false, message: 'Authentication failed. Wrong password.',authFail:true, });
                } else {
                    // if user is found and password is right
                    // create a token with only our given payload
                    // we don't want to pass in the entire user since that has the password
                    const payload = {
                        username: crypt.decrypt(user.username)
                    };
                    var token = jwt.sign(payload, process.env.JWT_SIGINING_KEY, {
                        algorithm: process.env.JWT_ALGORITHM,
                        expiresIn: 18000,
                        issuer: process.env.JWT_ISS
                    });

                    // return the information including token as JSON
                    // res.status(200).json({
                    //     success: true,
                    //     message: 'Enjoy your token!',
                    //     token: token
                    // });
                    res.body = JSON.stringify({
                        success: true, 
                        message: 'Enjoy your token!',
                        token: token
                    });
                }

                //callback(null, res); 
            }

            console.log(res);
            callback(null, res);

        } catch (error) {
             console.log('errorsssss: '); 
             console.log(error);   
        }

    });
}; 

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

在我的无服务器本地计算机上工作得很好,但是当我在AWS Lambda函数上尝试它时,它会发出"Internal server error"消息。

我已经查看了我的cloudwatch日志,响应对我来说似乎是正确的。这是我发送回回调的响应。

{
    statusCode: 200,
    headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Credentials': true
    },
    body: '{"success":true,"message":"Enjoy your token!","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InNhaW1hLm5hc2lyckBnbWFpbC5jb20iLCJpYXQiOjE1NDUwNjE4OTYsImV4cCI6MTU0NTA3OTg5NiwiaXNzIjoiaWFtbm90YWdlZWsuY28udWsifQ.2HyA-wpmkrmbvrYlWOG41W-ezuLCNQnt0Tvrnsy2n3I"}'
}

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,可能是由于Api网关配置所致。您的api公开吗?因为我在api不公开时遇到了此类问题。