Ответ
В 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) для эффективного управления подключениями к БД в высоконагруженных приложениях.
Ответ 18+ 🔞
Ёпта, ну смотри, тут про вставку данных в Node.js, аж овердохуища способов. Всё зависит от того, в какую именно базу ты свои данные пихать собрался. Сейчас разберём, как это делается без лишнего геморроя.
1. MongoDB через Mongoose (это типа ODM для неё): Самый, блядь, распространённый вариант, если ты с монгой работаешь.
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) {
// А вот тут лови ошибки, если email уже занят или данные кривые.
if (error.code === 11000) {
throw new Error('Пользователь с таким email уже существует, ядрёна вошь!');
}
throw error;
}
}
// 3. Можно короче, через create() — тоже норм.
const user = await User.create({ name: 'John', email: 'john@example.com' });
// 4. А если надо пачкой? insertMany() тебе в помощь.
const users = await User.insertMany([
{ name: 'Alice', email: 'alice@example.com' },
{ name: 'Bob', email: 'bob@example.com' }
]);
2. PostgreSQL или MySQL через Sequelize (это уже ORM): Тут уже ближе к классическим SQL-базам, но без этих ужасных строчек запросов.
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres', // или 'mysql'
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): А вот это для тех, кому ORM — как костыль, или когда надо выжать максимум скорости. Прям как в старые добрые времена, только с промисами.
const mysql = require('mysql2/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. Серьёзно, если будешь строки склеивать, тебя взломают за пять минут, и будешь потом охуевать, откуда в базе таблица
usersудалилась. Защита от инъекций — это святое. - Ошибки обрабатывай. Оберни всё в
try/catch. Особенно лови ошибки уникальности (в MongoDB это11000, в PostgreSQL —23505) и валидации данных. Игнорировать их — путь вникуда. - Используй пулы соединений. Они уже встроены в драйверы и ORM. Не открывай новое соединение на каждый чих — в высоконагруженном приложении база просто накроется медным тазом от таких подходов. Бери из пула, используй, возвращай.