azure javascript函数在回调后不返回任何内容

问题描述 投票:0回答:1

我正在尝试在一种天蓝色的javascript函数中执行MS SQL查询,并使用context.res.body返回结果。查询执行得很好,我可以在日志中看到结果,但是无法在回调内的context.res.body中返回它。看来我无法在回调中构建context.res.body。我在做什么错?

代码:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request
var TYPES = require('tedious').TYPES;

module.exports = async function (context, req) {
    context.log('authenticate request received');

    if (req.body && req.body.email && req.body.password) {

        var myRows = [];

        const config = {
            authentication: {
            options: {
                userName: "myData", // update me
                password: "myData" // update me
            },
            type: "default"
            },
            server: "myData.database.windows.net", // update me
            options: {
            database: "myData", //update me
            encrypt: true
            }
        }
        console.log("connect");

        var connection = new Connection(config);

        connection.on("connect", err => {
            if (err) {
                console.error(err.message);
            } else {
                console.log("Connected");  
                executeStatement(connection, function(error, rows) {
                    if (error) {
                        console.error(error.message);
                    } else {
                        console.log("disconnect")
                        myRows = rows;
                        connection.close();
                    }
                });
            }
        });

        connection.on("end", () => {
            console.log("respond to request");
            console.log(myRows);
            context.res = {
                body: myRows
            };
            context.done();
        })

    }
    else {
        context.res = {
            status: 401,
            body: {
                message: "not okay"
            }
        };
        console.log("not okay");
        context.done();
    }


    /**************** FUNCTIONS ****************/
    function executeStatement(connection, callback) {  
        const rows = [];

        const request = new Request(
            `SELECT ID, NickName, FirstName, Token, Provider FROM dbo.users WHERE Email=` + '\'' + req.body.email + '\'' + ' AND Password=' + '\'' + req.body.password + '\'',
            (err, rowCount) => {
              if (err) {
                console.error(err.message);
              } else {
                console.log('request: ' + `${rowCount} row(s) returned`);
                callback(null, rows);
              }
            }
        );

        request.on('row', function(columns) {  
            var row = {};

            columns.forEach(function(column) {
                if (column.value === null) {  
                    console.log('row: ' + column.metadata.colName + ' NULL');  
              } else {

                    row[column.metadata.colName] = column.value;
                    console.log("row: " + column.metadata.colName + " " + column.value);
              }
            });  

            rows.push(row);
        });

        connection.execSql(request);
    }  

};

log:

connect
row: ID 1
row: NickName test
row: FirstName NULL
row: Token Token
row: Provider johnykes
request: 1 row(s) returned
disconnect
respond to request
[ { ID: 1, NickName: 'test', Token: 'Token', Provider: 'johnykes' } ]
javascript node.js callback azure-functions tedious
1个回答
0
投票

尝试的事物:

  • [executeStatement应该是一个异步函数,并且您还应该将Azure Function的所有赋值和功能都移到回调表达式中,如下所示(没有尝试过SQL查询,但是其他的都可以,所以请检查适当的括号):

    connection.on("connect", err => {
            if (err) {
                console.error(err.message);
            } else {
                console.log("Connected");  
                executeStatement(connection, function(error, rows) {
                    if (error) {
                        console.error(error.message);
                    } else {
                        console.log("disconnect")
                        myRows = rows;
                        connection.close();
                    }
                    connection.on("end", () => {
                        console.log("respond to request");
                        console.log(myRows);
                        context.res = {
                            body: myRows
                        };
                        context.done();
                    })
            
                }
                else {
                    context.res = {
                        status: 401,
                        body: {
                            message: "not okay"
                        }
                    };
                    console.log("not okay");
                    context.done();
                }
    
                });
            }
        });
  • 此外,在创建如下所示的响应时,请添加相关的标题:

 context.res = {
            status: 302,
            headers: {
                'Content-Type': 'application/json'                
            },
            body:{}
        };
        context.done();

请尝试让我知道是否有效。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.