nodejs异步库:为什么在发生错误后没有触发回调?

afdcj2ne  于 2021-06-15  发布在  Mysql
关注(0)|答案(0)|浏览(221)

我一直在开发nodejs服务器的后端,该服务器目前使用库async和mysql。注意,这三个例程是在async的“瀑布”函数中执行的。其工作原理如下:
服务器连接到mysql数据库
mysql数据库在表“tag”中插入一个新条目
如果服务器试图插入一个重复的文件,则会抛出一个错误,测试将失败
服务器与mysql数据库断开连接
不幸的是,我用mocha运行的每个测试都会通过,即使服务器的mysql客户端试图插入一个副本。
我已经阅读了“async”库的文档。它说,如果在执行“瀑布”函数期间发生错误,控制流将被重定向到“瀑布”回调。我还试着查阅“mysql”库的文档。但我找不到任何能帮我解决问题的东西。我应该将可能引发错误的代码放在try-catch块中还是必须发出特殊回调?
文件:sqltagstest.js

  1. var mysql = require('mysql');
  2. var mySqlUtils = require('../../backend/MySqlHandler/MySqlUtils.js');
  3. var mySqlTags = require('../../backend/MySqlHandler/MySqlTags.js');
  4. describe('Create new tag',function(){
  5. var connection = "";
  6. var queryParams = "";
  7. before(function(done){
  8. connection = mysql.createConnection({
  9. host:'myHost',
  10. user:'root',
  11. password:'myPassword',
  12. database:'myDb'
  13. });
  14. queryParams = {
  15. name: 'Tag',
  16. description: 'Description',
  17. parent: 'root',
  18. creator: 'me',
  19. admin: false
  20. };
  21. done();
  22. });
  23. it('should create a new tag inside the database',function(){
  24. mySqlTags.CreateTag(connection,queryParams);
  25. });

文件:mysqltags.js

  1. var sqlUtils = require('./MySqlUtils.js');
  2. var reflectChanges = require('./MySqlReflection.js');
  3. var async = require('async');
  4. function CreateTag(connection,queryParams){
  5. async.waterfall([
  6. function SetupData(callback){
  7. callback(null,connection,queryParams);
  8. },
  9. sqlUtils.ConnectToDatabase,
  10. sqlUtils.InsertTagIntoDatabase,
  11. sqlUtils.CloseDatabaseConnection
  12. ],function(err,results){
  13. if(err)
  14. {
  15. throw err;
  16. }
  17. });
  18. }
  19. function DeleteTag(connection,queryParams,serverResponse){
  20. async.waterfall([
  21. function setupData(callback){
  22. callback(null,connection,queryParams);
  23. },
  24. sqlUtils.ConnectToDatabase,
  25. reflectChanges.DeleteTagEntry,
  26. reflectChanges.GenerateUncategorizedTag,
  27. reflectChanges.UpdateChildrensParent,
  28. sqlUtils.CloseDatabaseConnection
  29. ],function(error,results){
  30. if(error){
  31. serverResponse(queryParams,error,false);
  32. }else{
  33. serverResponse(queryParams.name,true);
  34. }
  35. });
  36. }
  37. function EditTag(queryParams,serverResponse){
  38. async.waterfall([
  39. sqlUtils.ConnectToDatabase,
  40. sqlUtils.CloseDatabaseConnection
  41. ],function(error,results){
  42. if(error){
  43. serverResponse(queryParams.name,false);
  44. }else{
  45. console.log("No errors!");
  46. serverResponse(queryParams.name,true);
  47. }
  48. });
  49. }
  50. module.exports = {
  51. CreateTag: CreateTag,
  52. DeleteTag: DeleteTag,
  53. EditTag: EditTag
  54. }

文件:mysqlutils.js

  1. var mySql = require('mysql');
  2. var reflectChanges = require('./MySqlReflection.js');
  3. var async = require('async');
  4. /**
  5. * connects to a MySql database
  6. * @param {connection which will be established} connection
  7. * @param {paremeters which are executed} queryParams
  8. * @param {callback which is required by the async library} callback
  9. */
  10. function ConnectToDatabase(connection,queryParams,callback){
  11. connection.connect(function(error){
  12. if(error){
  13. console.log(error);
  14. throw error;
  15. }else{
  16. callback(null,connection,queryParams);
  17. }
  18. });
  19. }
  20. /**
  21. * closes an existing connection to the MySql database
  22. * @param { connection which is passed from the previous function } connection
  23. * @param { callback when database connection was successfully closed } callback
  24. */
  25. function CloseDatabaseConnection(connection,queryParams,callback)
  26. {
  27. connection.end(function(error)
  28. {
  29. if(error){
  30. throw error;
  31. }else{
  32. callback(null,connection,queryParams);
  33. }
  34. });
  35. }
  36. /**
  37. * get all files which will be affected by the particular query
  38. * @param {*} connection
  39. * @param {*} queryParams
  40. * @param {*} callback
  41. */
  42. function GetAffectedFiles(connection,queryParams,callback)
  43. {
  44. const query = "SELECT Name,Tags FROM Tag";
  45. const params = [];
  46. var affectedRows = [];
  47. connection.query(query,params,function(error,results,fields){
  48. if(error){
  49. return connection.rollback(function(){
  50. throw error;
  51. });
  52. }else{
  53. for(var currRow = 0; currRow < results.length; currRow++)
  54. {
  55. if(results[currRow].Name === queryParams.name){
  56. affectedRows.push(results[currRow].Name);
  57. }
  58. }
  59. }
  60. queryParams.affectedRows = affectedRows;
  61. callback(connection,queryParams,callback);
  62. });
  63. }
  64. /**
  65. * inserts a new tag into the database
  66. * @param { connection which will be passed from the previous function } connection
  67. * @param { field values of the original row } queryParams
  68. * @param { callback called when query was executed successfully } callback
  69. */
  70. function InsertTagIntoDatabase(connection,queryParams,callback){
  71. const query = "INSERT INTO Tag(Id,Name,Description,Parent,Creator,Admin) VALUES((SELECT UUID()),?,?,?,?,?)";
  72. const params = [queryParams.name,queryParams.description,queryParams.parent,queryParams.creator,queryParams.admin];
  73. connection.query(query,params,function(error,results,fields){
  74. if(error){
  75. throw error;
  76. throw error;
  77. }else{
  78. callback(null,connection,queryParams);
  79. }
  80. });
  81. }
  82. /**
  83. * process chain which allows will be triggered upon tag deletion
  84. * @param { connection which was established between } connection
  85. * @param { queryParameters which will be passed to subroutines } queryParams
  86. * @param { callback which will be called upon termination } callback
  87. */
  88. function ReflectTagRemoval(connection,queryParams,callback){
  89. async.waterfall([
  90. function SetupPrequisites(callback){
  91. callback(null,connection,queryParams);
  92. },
  93. reflect.DeleteTagEntry,
  94. reflect.UpdateChildrenTag,
  95. reflect.UpdateFileTags,
  96. function PassFurther()
  97. {
  98. callback(null,connection,queryParams);
  99. }
  100. ]);
  101. }
  102. function ReflectTagUpdate(connection,queryParams,callback){
  103. async.waterfall([
  104. function SetupPrequisites(callback){
  105. callback(null,connection,queryParams);
  106. },
  107. ConnectToDatabase,
  108. reflectChanges.EditTagEntry,
  109. reflectChanges.EditTagChildrenAfterChanges,
  110. reflectChanges.UpdateFileTagsAfterEdit,
  111. function PassFurther(callback){
  112. callback(null,connection,queryParams);
  113. }
  114. ]);
  115. }
  116. function ValidateLoginCredentials(connection,loginCredentials,callback)
  117. {
  118. const query = "SELECT Name,Password FROM User WHERE Name = ? AND Password = ?";
  119. const params = [loginCredentials.username,loginCredentials.password];
  120. connection.query(query,params,function(error,results,fields){
  121. if(error)
  122. {
  123. throw error;
  124. }
  125. callback(null,connection);
  126. });
  127. }
  128. module.exports =
  129. {
  130. ConnectToDatabase: ConnectToDatabase,
  131. InsertTagIntoDatabase: InsertTagIntoDatabase,
  132. ReflectTagRemoval: ReflectTagRemoval,
  133. ReflectTagUpdate: ReflectTagUpdate,
  134. ValidateLoginCredentials: ValidateLoginCredentials,
  135. CloseDatabaseConnection : CloseDatabaseConnection
  136. }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题