pool.request is not a function

谁说胖子不能爱 提交于 2021-02-10 12:41:42

问题


I would like to setup my prepared statements with the mssql module. I created a query file for all user related requests.

const db = require('../databaseManager.js');

module.exports = {
  getUserByName: async username => db(async pool => await pool.request()
    .input('username', dataTypes.VarChar, username)
    .query(`SELECT
              *
            FROM
              person
            WHERE
              username = @username;`))
};

This approach allows me to require this query file and access the database by executing the query that is needed

const userQueries = require('../database/queries/users.js');

const userQueryResult = await userQueries.getUserByName(username); // call this somewhere in an async function

My database manager handles the database connection and executes the query

const sql = require('mssql');
const config = require('../config/database.js');
const pool = new sql.ConnectionPool(config).connect();

module.exports = async request => {
  try {
    const result = await request(pool);

    return {
      result: result.recordSet,
      err: null
    };
  } catch (err) {
      return {
          result: null,
          err
      }
  }
};

When I run the code I get the following error

UnhandledPromiseRejectionWarning: TypeError: pool.request is not a function

Does someone know what is wrong with the code?

I think this happens because the pool is not initialized yet... but I used async/await to handle this...


回答1:


Here is how I made your code work (I did some drastic simplifications):

const sql = require("mssql");
const { TYPES } = require("mssql");
const CONN = "";

(async () => {

  const pool = new sql.ConnectionPool(CONN);
  const poolConnect = pool.connect();
  const getUserByName = async username => {
    await poolConnect;
    try {
      const result = await pool.request()
.input("username", TYPES.VarChar, username)
.query(`SELECT
              *
            FROM
              person
            WHERE
              username = @username;`);
      return {
        result: result.recordset,
        err: null
      };
    } catch (err) {
      return {
        result: null,
        err
      };
    }
  };

  console.log(await getUserByName("Timur"));
})();

In short, first read this.

You probably smiled when saw that the PR was created just 2 months before your questions and still not reflected in here.

Basically, instead of:

const pool = new sql.ConnectionPool(config).connect();

you do this:

const pool = new sql.ConnectionPool(config);
const poolConnection = pool.connect();

//later, when you need the connection you make the Promise resolve
await poolConnection;


来源:https://stackoverflow.com/questions/56223275/pool-request-is-not-a-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!