node.js - 在另一个 .JS 文件的类中异步调用 SQL Server

标签 node.js

我在名为 utils.js 的文件中有以下代码:

class functions {
validateUser(userId, userKey, sessionKey, plId) {
        let response = {
            validated: false,
            isAdmin: false,
            isCorporate: false
        }
         sql.connect(process.env.DB_CONNSTRING, function (err) {
            if (err) { msg.success = "0"; msg.message = "ERR_04: Could not connect to server."; res.json(msg); return; };
            let sqlString = `SELECT userLevel FROM dbo.users WHERE (userId =@userId) AND (userKey = @userKey) 
            AND (sessionKey = @sessionKey) and (plId = @plId)`
            let request = new sql.Request();
            request.input('userId', sql.Int, userId);
            request.input('userKey', sql.NVarChar, userKey);
            request.input('sessionKey', sql.NVarChar, sessionKey);
            request.input('plId', sql.Int, plId);
            request.query(sqlString, function (err, results) {
                if (err) { msg.success = "0"; msg.message = "ERR_07: Could not connect to server."; res.json(msg); return; };
                if (results.rowsAffected[0] != 0) {
                    response.validated = true;
                    if (results.recordset[0].userLevel == 1 || results.recordset[0].userLevel == 10) {
                        response.isAdmin = true;
                    };
                    if (results.recordset[0].userLevel == 10) {
                        response.isCorporate = true;
                    };
                    return (response);
                }
                else {
                    return (response);
                };
            });
        });
    };
}
module.exports = { functions };

这基本上是为了验证登录用户是否具有正确的凭据。

从第二个 .js 文件中,我需要此文件:

const utils = require('../utils/utils')
const functions = new utils.functions;

然后,在 router.post 上,我像这样调用 validateUser:

let AuthUser = async () => {
        const string = await functions.validateUser(payload.body.credentials.userId, payload.body.credentials.userKey, payload.body.credentials.sessionKey, payload.body.credentials.plId);
        return string;
    };
let isValid = AuthUser();
console.log(isValid)

但是我没有在控制台上获得预期值,而是得到了

Promise { <pending> }

我尝试使 validateUser 异步,但仍然得到相同的结果。

这个想法是在我获取并处理 validateUser 的结果后继续运行代码

任何帮助将不胜感激。

谢谢。

最佳答案

class functions {
  validateUser(userId, userKey, sessionKey, plId) {
    return new Promise((resolve, reject) => {
      try {
        let response = {
          validated: false,
          isAdmin: false,
          isCorporate: false
        }
        sql.connect(process.env.DB_CONNSTRING, function (err) {
          if (err) throw err
          let sqlString = `SELECT userLevel FROM dbo.users WHERE (userId =@userId) AND (userKey = @userKey) AND (sessionKey = @sessionKey) and (plId = @plId)`
          let request = new sql.Request();
          request.input('userId', sql.Int, userId);
          request.input('userKey', sql.NVarChar, userKey);
          request.input('sessionKey', sql.NVarChar, sessionKey);
          request.input('plId', sql.Int, plId);
          request.query(sqlString, function (err, results) {
            if (err) {
              msg.success = "0"; msg.message = "ERR_07: Could not connect to server.";
              res.json(msg);
              resolve(res)
            } else {
              if (results.rowsAffected[0] != 0) {
                response.validated = true;
                if (results.recordset[0].userLevel == 1 || results.recordset[0].userLevel == 10) {
                  response.isAdmin = true;
                };
                if (results.recordset[0].userLevel == 10) {
                  response.isCorporate = true;
                };
              }
              resolve(response)
            }
          });
        });
      } catch (err) {
        reject(err)
      }
    })
  };
}

let AuthUser = () => {
  return new Promise(async (resolve, reject) => {
    try {
      const string = await functions.validateUser(payload.body.credentials.userId, payload.body.credentials.userKey, payload.body.credentials.sessionKey, payload.body.credentials.plId);
      resolve(string)
    } catch (err) {
      reject(err)
    }
  })
};
let isValid = await AuthUser();
console.log(isValid)

其控制台。记录尚未完成触发的响应

关于node.js - 在另一个 .JS 文件的类中异步调用 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68324713/

相关文章:

node.js - Nodemon安装错误问题

node.js - 使用 Parse.com Express.js 将 .ejs 扩展名更改为 .html

node.js - 您可以从非 websocket lambda 向 websocket 客户端发送消息吗?

angularjs - 如何将对象推送到空数组中

mysql - 大于和小于日期在 sequelize 中没有记录,但适用于 heidisql

javascript - Sequelize.js setter 函数没有按我的预期工作

node.js - Meteor 作为 npm 模块的依赖项?错误: Cannot find module 'meteor/mongo'

node.js - 使用 API 将 ics 文件导入谷歌日历

node.js - 即使我添加了安全组,也无法在特定端口上访问 EC2

javascript - Websocket 未向所有客户端发送数据