Инициализация асинхронног омодуля async/await
Здравствуйте. Есть необходимость написать модуль, который работает с БД MS SQL, и, как вы понимаете, инициализируется асинхронно. Кроме того, этот модуль подтягивает настройки приложения из БД. Есть нечто такое:
Модуль
// SQL может генерировать более 1 ошибки. Для их чтения смотрим err.precedingErrors
const sql = require('mssql');
const config = require('./config');
const qPreference = `SELECT [code], [value] FROM [setting] WHERE [type] != 'section' FOR JSON AUTO`
class AppSql{
constructor(){
this.sqlConfig = {
...
};
this._pool = null;
}
async init(){
try {
this._pool = await new sql.ConnectionPool(this.sqlConfig).connect();
const request = this._pool.request();
const result = await request.query(qPreference);
let resJSON = result.recordset[0];
if(!resJSON) resJSON = [];
config.loadData(resJSON);
} catch (err) {
console.log( 'AppSql.constructor error.');
}
}
}
// Экспорт инстанса
module.exports = new AppSql();
Вызов модуля в приложении:
const express = require('express');
const config = require('./class/config');
const app = express();
const sql = require('./class/appsql');
await sql.init();
// Тестовый обработчик запросов
app.get('/', async (req, res, next) => {
res.status(200).send('api run');
});
const port = process.env.PORT || config.getKey('apiPort');
app.listen(port, (err, req, res) => {
LOG.logInfo( "Application started at port: " + port );
});
Во время запуска выдает ошибку: await sql.init(); ^^^^^ SyntaxError: await is only valid in async function ... [nodemon] app crashed - waiting for file changes before starting... В чем ошибка и как сделать правильно? |
Цитата:
Цитата:
Или использовать await-top/аналоги. Или поставить последние версии ноды и запускать с флагом --harmony-top-level-await. |
Текст ошибки я понял. :о)
Не понятно что сделал неправильно. Конструктор у класса AppSql -- синхронный. Асинхронный код находится в функции Init (строка 16 первого блока кода) Вызв функции осуществляется с await: await sql.init(); Вроде бы так как вы говорите. Можете подкорректировать код как правильно? Не понимаю что именно не так. |
>SyntaxError: await действителен только в асинхронной функции
>в асинхронной функции >в Где у вас await? |
Спасибо за подсказку. Node.js для меня внове и потому логика приложений до меня туговато доходит. :)
Сделал так как вы советовали и без привлечения внешних ресурсов. Конструктор сделал синхронным, асинхронная инициалазация вынесена в асинхронные же функции. Инициализацию выполнил в самовызывающейся анонимной функции: Модуль SQL
async init(){
try {
this._pool = await new sql.ConnectionPool(this.sqlConfig).connect();
this._pool.on('error', (err) => {
LOG.logError( MSG.fgetMsg('eSqlCommon', err.stack) );
})
LOG.logInfo( MSG.getMsg('iSqlConnected') );
} catch (err) {
LOG.logError( 'AppSql.constructor. \n' + MSG.fgetMsg('eSqlConnect', err.stack) );
}
}
async loadPreferences(){
try {
const request = this._pool.request();
const result = await request.query(qPreference);
let resJSON = result.recordset[0];
if(!resJSON) resJSON = [];
config.loadData(resJSON);
LOG.logDebug( "AppSql.loadPreferences\n" + MSG.fgetMsg('mConfigRead', qPreference, resJSON.length, config.toString()) );
} catch (error) {
LOG.logError( "AppSql.loadPreferences\n" + MSG.fgetMsg('mConfigRead', error) );
}
}
главный модуль приложения:
const express = require('express');
const sanitizer = require('express-sanitizer');
const config = require('./class/config');
const app = express();
const LOG = require('./class/logger');
const sql = require('./class/appsql');
const apputil = require('./class/apputil');
const RouteRegistrator = require('./class/routeregistrator');
app.use(express.json());
// Корневой обработчик запросов. Для красоты
app.get('/', async (req, res, next) => {
res.status(200).send('api run');
next();
});
// Асинхронная инициализация приложения
(async () => {
// Инициализируем SQL и читаем настройки приложения
await sql.init();
await sql.loadPreferences();
// Регистрируем роуты
const reg = new RouteRegistrator(app);
reg.register();
// Глобальный обработчик ошибок.
apputil.initGlobalErrorHandler(app, LOG);
// Запускаем сервер
const port = process.env.PORT || config.getKey('apiPort');
app.listen(port, (err, req, res) => {
LOG.logInfo( "Application started at port: " + port );
});
})();
|
| Часовой пояс GMT +3, время: 13:05. |