0

我正在编写一个小的无服务器函数来使用节点 mssql 库(https://www.npmjs.com/package/mssql#callbacks)查询 MSSQL 数据库

我已经阅读了文档,我认为我做的一切都是正确的,但感到困惑 - 我可以在我的日志中看到结果,但是没有调用主函数回调,因此 API 没有输出数据(基本上是整个事情超时)

这是我的 Lambda 函数:

import {success, error} from './libs/response-lib';
import {EPDBConfig} from "./libs/Database-lib";
import sql from "mssql";
import config from "./config";

export function main(event, context, callback) {

    console.log("start");

    EPDBConfig().then(dbConfig => {

        if(config.debug) console.log("Hello!");

        let EPDBconfig = {
            user: dbConfig.dbuser,
            password: dbConfig.dbpassword,
            server: dbConfig.dbhost,
            database: dbConfig.dbname
        };

        sql.connect(EPDBconfig)
            .then(pool => {
                return pool.request()
                    .input('student_no', sql.Int, 129546)
                    .query('select * from Student where StudentNo = @student_no')
            }).then(result => {
                console.log("success!");
                if(config.debug) console.log('result', result);
                return result;
            }).catch(err => {
                if(config.debug) console.log('err1', err);
                return err;
            });

        sql.on('error', err => {
            if(config.debug) console.log('err2', err);
            return callback(null, error(err));
        });

        sql.on('done', result => {
            if(config.debug) console.log('done', result);
            return callback(null, success(result));
        });

    }).catch(err => {
        if(config.debug) console.log('err3', err);
        return callback(null, error(err));
    })
}

从 AWS KMS 中提取 DB Config 以实现安全变量

import AWS from "aws-sdk";
import config from "../config";

const kms = new AWS.KMS({
    region: AWS.config.region
});

export function EPDBConfig() {
    //DECRYPT THE DATABASE CONNECTION DETAILS

    return new Promise((resolve, reject) => {
        let params = {
            CiphertextBlob: Buffer(process.env.epdb, 'base64')
        };
        kms.decrypt(params, function(err, data) {
            if (err) {
                reject(err);
            } // an error occurred
            else {
                let dbParams = JSON.parse(String(data.Plaintext));
                resolve(dbParams);
            }

        });
    });
}

和响应库:

export function success(data, message) {
    return buildResponse(200, true, data, message);
}
export function error(data, message) {
    return buildResponse(400, false, data, message);
}
export function unauthorized(data, message) {
    return buildResponse(401, false, data, message);
}
export function forbidden(data, message) {
    return buildResponse(403, false, data, message);
}
export function exception(data, message) {
    return buildResponse(500, false, data, message);
}

function buildResponse(statusCode, successState, data, message) {
    var body = {
        success: successState,
        message: message
    };

    if (successState) {
        body.data = data;
    }
    return {
        statusCode: statusCode,
        headers: {
            'Access-Control-Allow-Origin' : '*',
            'Access-Control-Allow-Credentials': true
        },
        body: JSON.stringify(body)
    };
}

谁能指出我在这里出错的地方?我想我有一大堆承诺正在进行。sql.on('done', result => { ... 似乎不起作用,我尝试在我有 'success' 的区域添加 'return callback(null, success(result));'

请帮我!

4

1 回答 1

0

所以,我最终通过一些重构解决了这个问题:

import sql from "mssql";
import _ from "lodash";
import {success, error} from './libs/response-lib';
import {DB} from "./libs/Database-lib";
import {Student} from "./models/ep.student";

export function main(event, context, callback) {
    DB().then(pool => {
        return new Promise((resolve, reject) => {
            pool.connect(err => {
                if(err) reject(err);
                pool.request()
                    .input('StudentNo', sql.Int, 129546)
                    .execute('StoredProcedure')
                    .then(result => {
                        if(process.env.debug) console.log('result', result);
                        let student = new Student();
                        _.assign(student, result.recordset[0]);
                        resolve(student);
                        pool.close();
                    }).catch(err => {
                    reject(err);
                    pool.close();
                });

            });
        });
    }).then(result => {
        if(process.env.debug) console.log('result', result);
        callback(null, success(result));
    }).catch(err => {
        if(process.env.debug) console.log('err', err);
        callback(null, error(err));
    });
}

第一个问题是我没有终止我的连接 - 只是说明我切换到使用存储过程,因为这种情况总是如此。第二个问题是我并没有真正正确地使用 Promise(我认为)我将我的连接包裹在一个 Promise 中,只有当我得到响应时我才解决或拒绝它。

于 2017-12-01T00:36:22.303 回答