Node.js ve mssql npm paketini kullanarak Azure SQL Veritabanı bağlanma ve sorgulama
Şunlar için geçerlidir: Azure SQL Veritabanı
Bu hızlı başlangıçta bir uygulamanın Azure SQL Veritabanı'daki bir veritabanına nasıl bağlandığı ve Node.js ve mssql kullanarak sorgular nasıl gerçekleştirebileceğiniz açıklanır. Bu hızlı başlangıç, veritabanına bağlanmak için önerilen parolasız yaklaşımı izler.
Parolasız bağlantılar, Azure kaynaklarına erişmek için daha güvenli bir mekanizma sunar. Bu makaledeki parolasız bağlantıları kullanarak Azure SQL Veritabanı bağlanmak için aşağıdaki üst düzey adımlar kullanılır:
- Ortamınızı parolasız kimlik doğrulaması için hazırlayın.
- Yerel bir ortam için: Kişisel kimliğiniz kullanılır. Bu kimlik bir IDE, CLI veya diğer yerel geliştirme araçlarından çekilebilir.
- Bulut ortamı için: Yönetilen kimlik kullanılır.
- Doğrulanmış bir kimlik bilgisi almak için Azure Kimlik kitaplığından öğesini kullanarak
DefaultAzureCredential
ortamda kimlik doğrulaması. - Kaynak erişimi için Azure SDK istemci nesneleri oluşturmak için doğrulanmış kimlik bilgilerini kullanın.
Parolasız bağlantılar hakkında daha fazla bilgiyi parolasız hub'dan öğrenebilirsiniz.
- Azure aboneliği
- Azure SQL Veritabanı'da Microsoft Entra Id (eski adıyla Azure Active Directory) ile kimlik doğrulaması için yapılandırılmış bir veritabanı. Veritabanı oluştur hızlı başlangıcını kullanarak bir tane oluşturabilirsiniz.
- Bash özellikli kabuk
- Node.js LTS
- Visual Studio Code
- Visual Studio Code App Service uzantısı
- Azure CLI'nin en son sürümü
Azure SQL Veritabanı için güvenli, parolasız bağlantılar için belirli veritabanı yapılandırmaları gerekir. Hem yerel hem de barındırılan ortamlardaki Azure SQL Veritabanı düzgün bir şekilde bağlanmak için Azure'daki mantıksal sunucunuzda aşağıdaki ayarları doğrulayın:
Yerel geliştirme bağlantıları için mantıksal sunucunuzun yerel makine IP adresinizin ve diğer Azure hizmetlerinin bağlanmasına izin verecek şekilde yapılandırıldığından emin olun:
Sunucunuzun Ağ sayfasına gidin.
Ek yapılandırma seçeneklerini göstermek için Seçili ağlar radyo düğmesini değiştirin.
Yerel makinenizin IPv4 adresinden bağlantıları etkinleştirecek bir güvenlik duvarı kuralı eklemek için İstemci IPv4 adresinizi (xx.xx.xx.xx) ekle'yi seçin. Alternatif olarak, istediğiniz belirli bir IP adresini girmek için + Güvenlik duvarı kuralı ekle'yi de seçebilirsiniz.
Azure hizmetlerinin ve kaynaklarının bu sunucuya erişmesine izin ver onay kutusunun seçili olduğundan emin olun.
Uyarı
Azure hizmetlerinin ve kaynaklarının bu sunucuya erişmesine izin ver ayarını etkinleştirmek, üretim senaryoları için önerilen bir güvenlik uygulaması değildir. Gerçek uygulamalar daha güçlü güvenlik duvarı kısıtlamaları veya sanal ağ yapılandırmaları gibi daha güvenli yaklaşımlar uygulamalıdır.
Aşağıdaki kaynaklarda veritabanı güvenlik yapılandırmaları hakkında daha fazla bilgi edinebilirsiniz:
- Azure SQL Veritabanı güvenlik duvarı kurallarını yapılandırın.
- Özel uç noktalarla bir sanal ağ yapılandırın.
Sunucuda ayrıca Microsoft Entra kimlik doğrulaması etkinleştirilmiş ve atanmış bir Microsoft Entra yönetici hesabı olmalıdır. Yerel geliştirme bağlantıları için, Microsoft Entra yönetici hesabı yerel olarak Visual Studio'da veya Azure CLI'da oturum açabileceğiniz bir hesap olmalıdır. Mantıksal sunucunuzun Microsoft Entra Id sayfasında sunucunuzda Microsoft Entra kimlik doğrulamasının etkinleştirilip etkinleştirilmediğini doğrulayabilirsiniz.
Kişisel bir Azure hesabı kullanıyorsanız hesabınızı sunucu yöneticisi olarak atamak için Microsoft Entra kurulumunu yaptığınızdan ve Azure SQL Veritabanı için yapılandırdığınızdan emin olun. Şirket hesabı kullanıyorsanız, Microsoft Entra Id büyük olasılıkla sizin için zaten yapılandırılmış olacaktır.
Bu bölümdeki adımlar bir Node.js REST API oluşturur.
Proje için yeni bir dizin oluşturun ve bu dizine gidin.
Terminalde aşağıdaki komutu çalıştırarak projeyi başlatın:
npm init -y
Bu makaledeki örnek kodda kullanılan gerekli paketleri yükleyin:
npm install mssql express swagger-ui-express yamljs dotenv
Projeyi Visual Studio Code'da açın.
code .
package.json dosyasını açın ve projeyi ESM modülleri için yapılandırmak üzere name özelliğinden sonra aşağıdaki özelliği ve değeri ekleyin.
"type": "module",
Express.js OpenAPI uygulamasını oluşturmak için birkaç dosya oluşturacaksınız:
Dosya | Açıklama |
---|---|
.env.development | Yalnızca yerel geliştirme ortam dosyası. |
index.js | 3000 numaralı bağlantı noktasında Express.js uygulamasını başlatan ana uygulama dosyası. |
person.js | CRUD işlemlerini işlemek için /person yönlendirme API dosyasını Express.js. |
openapi.js | OpenAPI gezgini kullanıcı arabirimi için /api-docs yolunu Express.js. Kök bu yola yönlendirir. |
openApiSchema.yml | Kişi API'lerini tanımlayan OpenAPI 3.0 şema dosyası. |
config.js | Ortam değişkenlerini okumak ve uygun mssql bağlantı nesnesi oluşturmak için yapılandırma dosyası. |
database.js | mssql npm paketini kullanarak Azure SQL CRUD işlemlerini işlemek için veritabanı sınıfı. |
./vscode/settings.json | Dağıtım sırasında dosyaları glob düzenine göre yoksayın. |
bir index.js dosyası oluşturun ve aşağıdaki kodu ekleyin:
import express from 'express'; // Import App routes import person from './person.js'; import openapi from './openapi.js'; const port = process.env.PORT || 3000; const app = express(); // Connect App routes app.use('/api-docs', openapi); app.use('/persons', person); app.use('*', (_, res) => { res.redirect('/api-docs'); }); // Start the server app.listen(port, () => { console.log(`Server started on port ${port}`); });
bir person.js yol dosyası oluşturun ve aşağıdaki kodu ekleyin:
import express from 'express'; import { passwordConfig as SQLAuthentication, noPasswordConfig as PasswordlessConfig } from './config.js'; import { createDatabaseConnection } from './database.js'; const router = express.Router(); router.use(express.json()); const database = await createDatabaseConnection(SQLAuthentication); router.get('/', async (req, res) => { try { // Return a list of persons const persons = await database.readAll(); console.log(`persons: ${JSON.stringify(persons)}`); res.status(200).json(persons); } catch (err) { res.status(500).json({ error: err?.message }); } }); router.post('/', async (req, res) => { try { // add a person const person = req.body; console.log(`person: ${JSON.stringify(person)}`); const rowsAffected = await database.create(person); res.status(201).json({ rowsAffected }); } catch (err) { res.status(500).json({ error: err?.message }); } }); router.get('/:id', async (req, res) => { try { // Get the person with the specified ID const personId = req.params.id; console.log(`personId: ${personId}`); if (personId) { const result = await database.read(personId); console.log(`persons: ${JSON.stringify(result)}`); res.status(200).json(result); } else { res.status(404); } } catch (err) { res.status(500).json({ error: err?.message }); } }); router.put('/:id', async (req, res) => { try { // Update the person with the specified ID const personId = req.params.id; console.log(`personId: ${personId}`); const person = req.body; if (personId && person) { delete person.id; console.log(`person: ${JSON.stringify(person)}`); const rowsAffected = await database.update(personId, person); res.status(200).json({ rowsAffected }); } else { res.status(404); } } catch (err) { res.status(500).json({ error: err?.message }); } }); router.delete('/:id', async (req, res) => { try { // Delete the person with the specified ID const personId = req.params.id; console.log(`personId: ${personId}`); if (!personId) { res.status(404); } else { const rowsAffected = await database.delete(personId); res.status(204).json({ rowsAffected }); } } catch (err) { res.status(500).json({ error: err?.message }); } }); export default router;
Parolasız kimlik doğrulaması için, içinden geçirilen
createDatabaseConnection
SQLAuthentication
parametreyi olarakPasswordlessConfig
değiştirin.const database = await createDatabaseConnection(PasswordlessConfig);
bir openapi.js yol dosyası oluşturun ve OpenAPI UI gezgini için aşağıdaki kodu ekleyin:
import express from 'express'; import { join, dirname } from 'path'; import swaggerUi from 'swagger-ui-express'; import yaml from 'yamljs'; import { fileURLToPath } from 'url'; const __dirname = dirname(fileURLToPath(import.meta.url)); const router = express.Router(); router.use(express.json()); const pathToSpec = join(__dirname, './openApiSchema.yml'); const openApiSpec = yaml.load(pathToSpec); router.use('/', swaggerUi.serve, swaggerUi.setup(openApiSpec)); export default router;
mssql paketi, kimlik doğrulama türü için bir yapılandırma ayarı sağlayarak Azure SQL Veritabanı bağlantısını uygular.
Visual Studio Code'da bir config.js dosyası oluşturun ve Azure SQL Veritabanı kimlik doğrulaması yapmak için aşağıdaki mssql yapılandırma kodunu ekleyin.
import * as dotenv from 'dotenv'; if(process.env.NODE_ENV === 'development') { dotenv.config({ path: `.env.${process.env.NODE_ENV}`, debug: true }); } // TIP: Port must be a number, not a string! const server = process.env.AZURE_SQL_SERVER; const database = process.env.AZURE_SQL_DATABASE; const port = +process.env.AZURE_SQL_PORT; const type = process.env.AZURE_SQL_AUTHENTICATIONTYPE; const user = process.env.AZURE_SQL_USER; const password = process.env.AZURE_SQL_PASSWORD; export const noPasswordConfig = { server, port, database, authentication: { type }, options: { encrypt: true } }; export const passwordConfig = { server, port, database, user, password, options: { encrypt: true } };
Yerel ortam değişkenleriniz için bir .env.development dosyası oluşturma
Aşağıdaki metni ekleyin ve ve <YOURDATABASENAME>
değerlerinizle <YOURSERVERNAME>
güncelleştirin.
AZURE_SQL_SERVER=<YOURSERVERNAME>.database.windows.net
AZURE_SQL_DATABASE=<YOURDATABASENAME>
AZURE_SQL_PORT=1433
AZURE_SQL_AUTHENTICATIONTYPE=azure-active-directory-default
Not
Parolasız yapılandırma nesneleri, kullanıcı adları, parolalar veya erişim anahtarları gibi gizli diziler içermediğinden kaynak denetimine işlenebilir.
bir database.js dosyası oluşturun ve aşağıdaki kodu ekleyin:
import sql from 'mssql'; let database = null; export default class Database { config = {}; poolconnection = null; connected = false; constructor(config) { this.config = config; } async connect() { try { this.poolconnection = await sql.connect(this.config); this.connected = true; console.log('Database connected successfully.'); return this.poolconnection; } catch (error) { console.error('Error connecting to the database:', error); this.connected = false; } } async disconnect() { try { if (this.connected) { await this.poolconnection.close(); this.connected = false; console.log('Database disconnected successfully.'); } } catch (error) { console.error('Error disconnecting from the database:', error); } } async executeQuery(query) { const request = this.poolconnection.request(); const result = await request.query(query); return result.rowsAffected[0]; } async create(data) { const request = this.poolconnection.request(); request.input('firstName', sql.NVarChar(255), data.firstName); request.input('lastName', sql.NVarChar(255), data.lastName); const result = await request.query( `INSERT INTO Person (firstName, lastName) VALUES (@firstName, @lastName)` ); return result.rowsAffected[0]; } async readAll() { const request = this.poolconnection.request(); const result = await request.query(`SELECT * FROM Person`); return result.recordsets[0]; } async read(id) { const request = this.poolconnection.request(); const result = await request .input('id', sql.Int, +id) .query(`SELECT * FROM Person WHERE id = @id`); return result.recordset[0]; } async update(id, data) { const request = this.poolconnection.request(); request.input('id', sql.Int, +id); request.input('firstName', sql.NVarChar(255), data.firstName); request.input('lastName', sql.NVarChar(255), data.lastName); const result = await request.query( `UPDATE Person SET firstName=@firstName, lastName=@lastName WHERE id = @id` ); return result.rowsAffected[0]; } async delete(id) { const idAsNumber = Number(id); const request = this.poolconnection.request(); const result = await request .input('id', sql.Int, idAsNumber) .query(`DELETE FROM Person WHERE id = @id`); return result.rowsAffected[0]; } async createTable() { if (process.env.NODE_ENV === 'development') { this.executeQuery( `IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Person') BEGIN CREATE TABLE Person ( id int NOT NULL IDENTITY, firstName varchar(255), lastName varchar(255) ); END` ) .then(() => { console.log('Table created'); }) .catch((err) => { // Table may already exist console.error(`Error creating table: ${err}`); }); } } } export const createDatabaseConnection = async (passwordConfig) => { database = new Database(passwordConfig); await database.connect(); await database.createTable(); return database; };
Uygulama yerel olarak test edilmeye hazırdır. Visual Studio Code'da Azure Bulut'ta veritabanınızın yöneticisi olarak ayarladığınız hesapla oturum açtığınızdan emin olun.
Uygulamayı aşağıdaki komutla çalıştırın. Uygulama 3000 numaralı bağlantı noktasında başlar.
NODE_ENV=development node index.js
Bu uygulamayı çalıştırdığınızda veritabanında Kişi tablosu oluşturulur.
Tarayıcıda, konumundaki http://localhost:3000OpenAPI gezginine gidin.
Swagger kullanıcı arabirimi sayfasında POST yöntemini genişletin ve Deneyin'i seçin.
Örnek JSON'ı özelliklerin değerlerini içerecek şekilde değiştirin. ID özelliği yoksayılır.
Veritabanına yeni bir kayıt eklemek için Yürüt'e tıklayın. API başarılı bir yanıt döndürür.
Swagger kullanıcı arabirimi sayfasında GET yöntemini genişletin ve Deneyin'i seçin. Yürüt'e tıklayın ve yeni oluşturduğunuz kişi döndürülür.
Bir
.vscode
klasör oluşturun ve klasörde bir settings.json dosyası oluşturun.Zip dağıtımı sırasında ortam değişkenlerini ve bağımlılıklarını yoksaymak için aşağıdakileri ekleyin.
{ "appService.zipIgnorePattern": ["./.env*","node_modules{,/**}"] }
Uygulama Azure'a dağıtılmaya hazırdır. Visual Studio Code bir Azure Uygulaması Hizmeti oluşturabilir ve uygulamanızı tek bir iş akışında dağıtabilir.
Uygulamanın durdurulduğunu doğrulayın.
Henüz yapmadıysanız, Komut Paleti'nde Azure: Azure Bulut'ta Oturum Aç komutunu seçerek Azure'da oturum açın (Ctrl + Shift + P)
Visual Studio Code'un Azure Gezgini penceresinde App Services düğümüne sağ tıklayın ve Yeni Web Uygulaması Oluştur (Gelişmiş)'i seçin.
App Service'i oluşturmak için aşağıdaki tabloyu kullanın:
İstem Değer Yeni web uygulaması için genel olarak benzersiz bir ad girin. gibi azure-sql-passwordless
bir istem girin. gibi123
benzersiz bir dizeyi son kaleme alır.Yeni kaynaklar için bir kaynak grubu seçin. +Yeni kaynak grubu oluştur'u ve ardından varsayılan adı seçin. Bir çalışma zamanı yığını seçin. Node.js yığınının LTS sürümünü seçin. bir işletim sistemi seçin. Linux'ı seçin. Yeni kaynaklar için bir konum seçin. Size yakın bir konum seçin. Bir Linux App Service planı seçin. Yeni App Service planı oluştur'u ve ardından varsayılan adı seçin. Fiyatlandırma katmanını seçin. Ücretsiz (F1) seçeneğini belirleyin. Uygulamanız için bir Application Insights kaynağı seçin. Şimdilik atla'yı seçin. Devam etmeden önce uygulamanızın oluşturulduğuna ilişkin bildirime kadar bekleyin.
Azure Gezgini'nde App Services düğümünü genişletin ve yeni uygulamanıza sağ tıklayın.
Web Uygulamasına Dağıt'ı seçin.
JavaScript projesinin kök klasörünü seçin.
Visual Studio Code açılır penceresi görüntülendiğinde Dağıt'ı seçin.
Dağıtım tamamlandığında uygulama Azure'da düzgün çalışmaz. Yine de verilerinizi almak için App Service ile SQL veritabanı arasındaki güvenli bağlantıyı yapılandırmanız gerekir.
App Service örneğini Azure SQL Veritabanı bağlamak için aşağıdaki adımlar gereklidir:
- App Service için yönetilen kimlik oluşturma.
- Bir SQL veritabanı kullanıcısı oluşturun ve bunu App Service yönetilen kimliğiyle ilişkilendirin.
- Veritabanı kullanıcısına okuma, yazma ve diğer izinlere izin veren SQL rolleri atayın.
Bu adımları uygulamak için kullanabileceğiniz birden çok araç vardır:
Hizmet Bağlayıcısı, Azure'daki farklı hizmetler arasındaki kimliği doğrulanmış bağlantıları kolaylaştıran bir araçtır. Service Connector şu anda komutunu kullanarak Bir App Service'i Azure CLI aracılığıyla Azure SQL veritabanına bağlamayı desteklemektedir az webapp connection create sql
. Bu tek komut sizin için yukarıda belirtilen üç adımı tamamlar.
Azure portalının Cloud Shell'inde aşağıdaki komutu çalıştırın. Cloud Shell, Azure CLI'nın en son sürümüne sahiptir. içindeki <>
değişkenleri kendi değerlerinizle değiştirin.
az webapp connection create sql \
-g <app-service-resource-group> \
-n <app-service-name> \
--tg <database-server-resource-group> \
--server <database-server-name> \
--database <database-name> \
--system-identity
App Service ayarlarında Service Connector tarafından yapılan değişiklikleri doğrulayabilirsiniz.
Visual Studio Code'da, Azure gezgininde App Service'inize sağ tıklayın ve Portalda aç'ı seçin.
App Service'inizin Kimlik sayfasına gidin. Sistem tarafından atanan sekmesinin altında Durum Açık olarak ayarlanmalıdır. Bu değer, uygulamanız için sistem tarafından atanan yönetilen kimliğin etkinleştirildiği anlamına gelir.
App Service'inizin Yapılandırma sayfasına gidin. Uygulama Ayarları sekmesinde, zaten mssql yapılandırma nesnesinde olan çeşitli ortam değişkenlerini görmeniz gerekir.
AZURE_SQL_SERVER
AZURE_SQL_DATABASE
AZURE_SQL_PORT
AZURE_SQL_AUTHENTICATIONTYPE
Özellik adlarını veya değerlerini silmeyin veya değiştirmeyin.
Azure SQL Veritabanı bağlantısının çalışıp çalışmadığını test etmek için uygulamanın URL'sine göz atın. Uygulamanızın URL'sini App Service'e genel bakış sayfasında bulabilirsiniz.
Yerel olarak oluşturduğunuz kişinin tarayıcıda görüntülenmesi gerekir. Tebrikler! Uygulamanız artık hem yerel hem de barındırılan ortamlardaki Azure SQL Veritabanı bağlı.
İpucu
Test sırasında 500 İç Sunucu hatası alırsanız, bunun nedeni veritabanı ağ yapılandırmalarınız olabilir. Mantıksal sunucunuzun Veritabanını yapılandırma bölümünde özetlenen ayarlarla yapılandırıldığını doğrulayın.
Azure SQL Veritabanı ile çalışmayı bitirdiğinizde, istenmeyen maliyetlerden kaçınmak için kaynağı silin.
Azure portalı arama çubuğunda Azure SQL'i arayın ve eşleşen sonucu seçin.
Veritabanı listesinde veritabanınızı bulun ve seçin.
Azure SQL Veritabanı Genel Bakış sayfasında Sil'i seçin.
Açılan Azure'da silmek istediğinizden emin olun... sayfasında, onaylamak için veritabanınızın adını yazın ve sil'i seçin.
Bu uygulamanın örnek kodu kullanılabilir: