- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
开发 Azure JS Function(NodeJS),使用 mssql 组件操作数据库。当SQL语句执行完成后,在Callback函数中执行日志输出 context.log(" ...") , 遇见如下错误:
Warning: Unexpected call to 'log' on the context object after function execution has completed. 。
Please check for asynchronous calls that are not awaited or calls to 'done' made before function execution completes. 。
Function name: HttpTrigger1. Invocation Id: e8c69eb5-fcbc-451c-8ee6-c130ba86c0e9. Learn more: https://go.microsoft.com/fwlink/?linkid=2097909 。
。
var sql = require('mssql' ); var config = { user: 'username' , password: 'Password' , server: '<server name>.database.chinacloudapi.cn', // You can use 'localhost\\instance' to connect to named instance database: 'db name' , options: { encrypt: true // Use this if you're on Windows Azure } }
module.exports = async function (context, req) { context.log( 'JavaScript HTTP trigger function processed a request.' ); await callDBtoOutput(context); context.log( '################' ); // Default Code ... const name = (req.query.name || (req.body && req.body.name)); const responseMessage = name ? "Hello, " + name + ". This HTTP triggered function executed successfully." : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." ; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage }; } async function callDBtoOutput(context) { try { context.log( "Some Message from callDBtoOutput" ) var ps = new sql.PreparedStatement(await sql.connect(config)) await ps.prepare( 'SELECT SUSER_SNAME() ', async function (err) { if (err) { context.log(err) } context.log( "start to exec sql ...from callDBtoOutput" ) await ps.execute({}, async function (err, recordset) { // ... error checks context.log(recordset) context.log( "Login SQL DB successfully....from callDBtoOutput" ) ps.unprepare( function (err) { // ... error checks }); }); }); } catch (error) { context.log(`Some Error Log: from callDBtoOutput`, error); } }
在 callDBtoOutput() 函数中,调用sql prepare 和 execute方法执行sql语句,虽然已经使用了async和await关键字,但根据测试结果表明:Function的主线程并不会等待callback函数执行。当主线程中context对象释放后,子线程中继续执行context.log函数时就会遇见以上警告信息。 。
。
为了解决以上prepare和execute方法中日志输出问题,需要使用其他执行sql的方法。在查看mssql的官方说明( https://www.npmjs.com/package/mssql#query-command-callback )后,发现query方法能够满足要求.
query (command, [callback])
Execute the SQL command. To execute commands like create procedure or if you plan to work with local temporary tables, use batch instead. 。
Arguments 。
- command - T-SQL command to be executed.
- callback(err, recordset) - A callback which is called after execution has completed, or an error has occurred. Optional. If omitted, returns Promise.
。
经过多次测试,以下代码能完整输出Function过程中产生的日志.
var sql = require('mssql' ); var config = { user: 'username' , password: 'Password' , server: '<server name>.database.chinacloudapi.cn', // You can use 'localhost\\instance' to connect to named instance database: 'db name' , options: { encrypt: true // Use this if you're on Windows Azure } } module.exports = async function (context, req) { context.log( 'JavaScript HTTP trigger function processed a request.' ); // context.log('call callDBtoOutput 1'); // await callDBtoOutput(context); // context.log('call callDBtoOutput 2'); await callDBtoOutput2(context); context.log( '################' ); const name = (req.query.name || (req.body && req.body.name)); const responseMessage = name ? "Hello, " + name + ". This HTTP triggered function executed successfully." : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." ; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage }; } async function callDBtoOutput2(context) { context.log( "1: Call SQL Exec function ...." ) await sql.connect(config).then(async function () { // Query context.log("2: start to exec sql ... " ) await new sql.Request().query('SELECT SUSER_SNAME() ').then(async function (recordset) { context.log( "3: Login SQL DB successfully.... show the Query result" ) context.log(recordset); }). catch ( function (err) { // ... error checks }); }) context.log( "4: exec sql completed ... " ) }
。
node-mssql: https://www.npmjs.com/package/mssql 。
context.done : https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-node?pivots=nodejs-model-v3&tabs=javascript%2Cwindows-setting-the-node-version#contextdone 。
The context.done method is deprecated 。
Now, it's recommended to remove the call to context.done() and mark your function as async so that it returns a promise (even if you don't await anything). 。
最后此篇关于【Azure应用服务】AzureJSFunction异步方法中执行SQL查询后,Callback函数中日志无法输出问题的文章就讲到这里了,如果你想了解更多关于【Azure应用服务】AzureJSFunction异步方法中执行SQL查询后,Callback函数中日志无法输出问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!