Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   node.js и MS SQL Server (https://javascript.ru/forum/node-js-io-js/78614-node-js-i-ms-sql-server.html)

Frol 09.10.2019 17:31

node.js и MS SQL Server
 
Доброго времени суток!
Я за советом! Подскажите пожалуйста какой наиболее удобный модуль node.js можно использовать для работы с БД MS SQL Server при реализации web-приложения на Express. И где можно найти подробную документацию по нему.
Спасибо!

SuperZen 09.10.2019 18:05

надо посмотреть
https://github.com/typeorm/typeorm
потом это должно быть
https://docs.nestjs.com/recipes/sql-typeorm
если нужен хардкод
https://github.com/tediousjs/node-mssql

Frol 09.10.2019 19:02

Допустим, берем хардкод. Метод request.query("SELECT ...") возвращает объект Promise. Как из него вытащить данные?

Frol 10.10.2019 11:13

Немного изучив mssql и Promise получил вот такой рабочий вариант:
const mssql = require('mssql');
const config = {
    server: "localhost",
    user: "sa",
    database: "support",
    password: "01470258"
}

class DB {
    constructor() {
        this.pool = new mssql.ConnectionPool(config);
        this.poolConnect = this.pool.connect().then(() => {
            console.log("Успешное подключение к базе данных");
            this.connect = true;
            this.request = this.pool.request();
        }, () => {
            console.log("Не удалось подключиться к базе данных");
            this.connect = false;
        });
    }

    async query(sql, cb) {
        await this.poolConnect;
        if (this.connect) {
            this.request.query(sql).then((result) => {
                console.log("Успешный запрос");
                cb(result.recordset);
            }, () => {
                console.log("Ошибка при обработке запроса");
                cb(null, "Ошибка при обработке запроса");
            });
        } else {
            cb(null, "Ошибка подключения к БД");
        };
    }
}

module.exports = DB;


Насколько хороша такая реализация?

Frol 10.10.2019 13:00

Да и параметрические SQL запросы можно реализовать только с помощью
request.input();
request.execute();
или есть еще способы?

SuperZen 10.10.2019 13:36

лучше потратить время на typeorm

sniffysko 10.10.2019 17:28

У меня типа так:
const sql = require('mssql');

let _instance = null;

class AppSql{
	constructor(){
		const sqlConfig = {
			user: config.sql.user,
			password: config.sql.password,
			database: config.sql.database,
			server: config.sql.server,
			domain: config.sql.domain,
			parseJSON: config.sql.parseJSON,
			options: {
				trustedConnection: config.sql.trustedConnection,
			}
		};

		this._pool = null;

		(async () => {
			try {
				this._pool = await new sql.ConnectionPool(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) );
			}
		})();
	}

	get pool(){
		return this._pool;
	}


	async querySimple(q, params){
		await this._pool; 
		try {
			const request = this._pool.request();
			if(params){
				for (const key in params) {
					const value = params[key];
					request.input(key, value);
				}
			}
			const result = await request.query(q);
			return Promise.resolve(result);
		} catch (err) {
			console.log(q, err);
			return Promise.reject(err);
		}
	}

}


sql.on('error', (err) => {
	LOG.logError( 'SQL Emitter.\n' + MSG.fgetMsg('eSqlCommon', err.stack) );
});

// Экспорт инстанса
module.exports = {
	getInstance: () => {
		return _instance || (_instance = new AppSql());
	}
};


Часовой пояс GMT +3, время: 06:07.