我正在尝试在一种天蓝色的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' } ]
尝试的事物:
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();
请尝试让我知道是否有效。
希望有帮助。