Node.js 使用Express.js连接到SQL Server

Node.js 使用Express.js连接到SQL Server,node.js,sql-server,express,Node.js,Sql Server,Express,我正在编写从express.js连接到SQL Server的代码。一切正常,但我想在函数末尾返回错误。我声明了全局变量,如果有错误,我会将错误分配给该变量,并在最后返回。但我仍然没有定义变量值。请有人帮我做这件事 代码如下: async function mysqlConnection(userParam) { var config = { user: userParam.connectionUsername, password: userParam.connectionP

我正在编写从express.js连接到SQL Server的代码。一切正常,但我想在函数末尾返回错误。我声明了全局变量,如果有错误,我会将错误分配给该变量,并在最后返回。但我仍然没有定义变量值。请有人帮我做这件事

代码如下:

 async function mysqlConnection(userParam) {
  var config = {
    user: userParam.connectionUsername,
    password: userParam.connectionPassword,
    server: userParam.hostname,
    database: userParam.databaseAccount,
  };

  var msg
  let connection=sql.connect(config, function (err) {
    if (err) {
      console.log(err.message);
      msg=err.message // return err;
    } else {
      console.log("Done");
    }
    return msg
  });

  console.log(msg)
  return msg
}
我也试过这个

  async function mysqlConnection(userParam) {
  var config = {
    user: userParam.connectionUsername,
    password: userParam.connectionPassword,
    server: userParam.hostname,
    database: userParam.databaseAccount,
  };

 var msg
  try {

    let connection=await sql.connect(config);
    return msg; // undefined
  } catch (err) {
     console.log(err.message);
     msg = err.message;
     return msg;
  }

}
这里的
msg
是一个全局变量,我在if条件中赋值,我在函数结束前返回该变量,但如果连接失败,我得到的是未定义的,而不是错误消息,但在if条件中我得到的是错误消息。请有人能提出解决方案吗


谢谢

您正在使用回调函数连接到SQL Server。这两条线:

  console.log(msg)
  return msg
在回调函数中的代码之前执行

  if (err) {
      console.log(err.message);
      msg=err.message // return err;
    } else {
      console.log("Done");
    }
    return msg
因此,变量
msg
未定义

我的建议是:尽可能避免回调,搜索相同的函数,但使用Promise或async/await样式而不是回调。然后,您可以将代码重写为:

 var msg
try {

  let connection=await sql.connectAsync(config);
  return msg; // undefined
} catch (err) {
   console.log(err.message);
   msg = err.message;
   return msg;
}
这些文章可以帮助您更好地理解:

--编辑--

要进行调试,可以在try-and-catch块中添加一些console.log

var msg;
try {

  let connection=await sql.connect(config);
  console.log("Connect to database success");
// the msg variable is undefined here because we haven't assigned any value to it
// so it's normal
 return "Connect to database success"; 
} catch (err) {
   console.log("Error when connecting to database");
   console.log(err); // not sure if err.message is defined.
                    // You should look into the err variable to check that

   return "Error"; // we can return our custom message, or `err.message` if it present in err object
}

最后,您甚至不需要msg变量,而是使用回调函数连接到SQL Server。这两条线:

  console.log(msg)
  return msg
在回调函数中的代码之前执行

  if (err) {
      console.log(err.message);
      msg=err.message // return err;
    } else {
      console.log("Done");
    }
    return msg
因此,变量
msg
未定义

我的建议是:尽可能避免回调,搜索相同的函数,但使用Promise或async/await样式而不是回调。然后,您可以将代码重写为:

 var msg
try {

  let connection=await sql.connectAsync(config);
  return msg; // undefined
} catch (err) {
   console.log(err.message);
   msg = err.message;
   return msg;
}
这些文章可以帮助您更好地理解:

--编辑--

要进行调试,可以在try-and-catch块中添加一些console.log

var msg;
try {

  let connection=await sql.connect(config);
  console.log("Connect to database success");
// the msg variable is undefined here because we haven't assigned any value to it
// so it's normal
 return "Connect to database success"; 
} catch (err) {
   console.log("Error when connecting to database");
   console.log(err); // not sure if err.message is defined.
                    // You should look into the err variable to check that

   return "Error"; // we can return our custom message, or `err.message` if it present in err object
}

最后,您甚至不需要msg变量

我尝试了这个方法,但只是有时候它会重新调整msg值,但在它显示未定义后会再次使用。请帮助我,我编辑了我的答案,添加了更多详细信息。希望有帮助我尝试过这个,但只是有时它会重新调整msg值,但在它显示未定义后,请帮助我。我编辑了我的答案,添加了更多细节。希望能有所帮助