mssql — исключение uncaughtException в потоковом режиме

#javascript #node.js #node-streams #nodejs-stream #node-mssql

Вопрос:

Я сталкиваюсь с той же проблемой, что и упомянутая здесь:

При попытке использовать stream и запрашивать таблицу без упоминания schema .

Что-то вроде select * from table вместо select * from schema_name.table . Я получаю следующую ошибку: mssql uncaughtException RequestError: Invalid object name

Я смог зарегистрировать ошибку во время прослушивания readStream.on('error') , но она все равно выдает uncaughtException .

Версии программного обеспечения

 "mssql": "^7.2.1",
"nodejs":  "12.15.0"
 

Ожидаемое поведение:

Должна быть возможность перехватить исключение uncaughtException

Фактическое поведение:

 INFO: waaaaaa1
uncaughtException RequestError: Invalid object name 'employee'.
at handleError (.../node_modules/mssql/lib/tedious/request.js:388:15)
at Connection.emit (events.js:223:5)
at Connection.emit (.../node_modules/tedious/lib/connection.js:1071:18)
at Parser. (.../node_modules/tedious/lib/connection.js:1176:12)
at Parser.emit (events.js:223:5)
at Readable. (.../node_modules/tedious/lib/token/token-stream-parser.js:27:14)
 

Конфигурация:

     import mssql from 'mssql';
       try {
    mssql.connect({
      server,
      port: Number.parseInt(port),
      database,
      user,
      password,
      options: {
        encrypt: true, // for azure
        trustServerCertificate: trustServerCertificate ? true : false // change to true for local dev / self-signed certs
      }
    })
      .then(async client => {
        const readStream = client.request();
        readStream.stream = true;
        const passThroughStream = new stream.PassThrough();
        const writeStream = fs.createWriteStream(path.join(__dirname, './writeMe.json'));
      
        readStream.on('error', () => log.info('waaaaaa1'));
        passThroughStream.on('error', () => log.info('waaaaaa2'));
        writeStream.on('error', () => log.info('waaaaaa3'));

        readStream.pipe(passThroughStream).pipe(writeStream);
        readStream.query(query);
      })
      // the promise error handler
      .catch(() => {
        log.info('waaaaaa4');
      });

    // the main sql error handler:
    mssql.on('error', error => {
      log.error('SQL error1', error);
    });

    // the main sql error handler:
    client.on('error', error => {
      log.error('SQL error2', error);
    });


  }
  catch (err) {
    log.info('catchhhh meee', err);
  }
  finally {
    if(client){
      client.close();
    }
  }
 

Ответ №1:

Наконец-то проблема решена с помощью const readableStream = request.toReadableStream();

Полный код:

 const request = client.request();
const readableStream = request.toReadableStream();
const writeStream = fs.createWriteStream(path.join(__dirname, './writeMe.json'));
const passThroughStream = new stream.PassThrough();
readableStream.on('end', () => passThroughStream.end());
readableStream.on('error', (e) => log.info('waaaaaa1'));
readableStream.pipe(passThroughStream).pipe(writeStream);
request.query(query);
 

Ответ №2:

Попробуйте добавить обработчик catch к connect объекту и, что более важно, к mssql объекту, как указано в документах

 mssql.connect({
   // ...
    
 })
.then(() => {
    return readStream.query(query);
})

// the promise error handler
.catch(() => {
    
})

// the main sql error handler:
mssql.on('error', error => {
    console.error('SQL error')
})
 

Комментарии:

1. Привет, спасибо, я обновил код, по-прежнему получая ту же ошибку

2. О чем readstream.query(query).catch(). ? Другой идеей было бы перехватить ошибку, используя process.on('ungaughtException) , возможно, вы получите дополнительную информацию. Также я бы попробовал использовать await/try catch внутри асинхронной функции для получения ошибки. У меня нет других идей. удачи

3. Может быть readStream.query(query).on('error') , есть и обработчик?

4. Да, я сделал это, как вы можете видеть в коде, он печатает «waaaaa1»