Ответ
В Node.js для вставки данных используются ORM (Object-Relational Mapping) библиотеки или нативные драйверы баз данных. Вот как это выглядит на практике для разных БД.
1. MongoDB с Mongoose (ODM): Самый распространенный способ для MongoDB.
const mongoose = require('mongoose');
// 1. Определение схемы и модели
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: {
type: String,
required: true,
unique: true,
lowercase: true
},
createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);
// 2. Вставка одного документа
async function createUser(userData) {
try {
// Создание экземпляра модели и сохранение
const newUser = new User(userData);
const savedUser = await newUser.save(); // Выполняет INSERT
console.log('User created with ID:', savedUser._id);
return savedUser;
} catch (error) {
// Обработка ошибок валидации или дубликатов
if (error.code === 11000) {
throw new Error('Пользователь с таким email уже существует');
}
throw error;
}
}
// 3. Альтернатива: create() (краткая запись)
const user = await User.create({ name: 'John', email: 'john@example.com' });
// 4. Вставка нескольких документов
const users = await User.insertMany([
{ name: 'Alice', email: 'alice@example.com' },
{ name: 'Bob', email: 'bob@example.com' }
]);
2. PostgreSQL/MySQL с Sequelize (ORM):
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres',
logging: false
});
// Определение модели
const User = sequelize.define('User', {
name: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, unique: true }
});
await sequelize.sync(); // Синхронизация модели с таблицей (в продакшене используем миграции)
// Вставка записи
const newUser = await User.create({
name: 'Jane Doe',
email: 'jane@example.com'
});
console.log('User created with ID:', newUser.id);
3. Нативный запрос с драйвером (например, mysql2 или pg):
Прямые запросы используются для оптимизации или в простых сценариях.
const mysql = require('mysql2/promise'); // Используем promise-интерфейс
async function insertUser(name, email) {
const connection = await mysql.createConnection(process.env.DATABASE_URL);
try {
// Параметризованный запрос для защиты от SQL-инъекций
const [result] = await connection.execute(
'INSERT INTO users (name, email) VALUES (?, ?)',
[name, email]
);
console.log('Inserted ID:', result.insertId);
return result.insertId;
} finally {
await connection.end(); // Всегда закрываем соединение
}
}
Критически важные практики:
- Всегда используйте асинхронные методы (
await,.then()) для неблокирующих операций. - Параметризуйте все запросы при работе с реляционными БД, чтобы исключить SQL-инъекции.
- Обрабатывайте ошибки через
try/catch. Особое внимание — ошибкам уникальности (11000в MongoDB,23505в PostgreSQL) и валидации. - Используйте пулы соединений (встроены в драйверы и ORM) для эффективного управления подключениями к БД в высоконагруженных приложениях.