# Neon 无服务器驱动程序
在无服务器环境中使用 `@neondatabase/serverless` 驱动程序连接 Neon 数据库的模式和最佳实践。该驱动程序通过 **HTTP** 连接以实现快速的单次查询,或通过 **WebSockets** 连接以实现 `node-postgres` 兼容性和交互式事务。
官方文档:
bash
curl -H "Accept: text/markdown" https://neon.tech/docs/serverless/serverless-driver
## 安装
bash
# 使用 npm
npm install @neondatabase/serverless
# 使用 JSR
bunx jsr add @neon/serverless
**注意:** 1.0.0+ 版本需要 **Node.js v19 或更高版本**。
对于依赖 `pg` 但希望使用 Neon 基于 WebSocket 连接池的项目:
"dependencies": {
"pg": "npm:@neondatabase/serverless@^0.10.4"
},
"overrides": {
"pg": "npm:@neondatabase/serverless@^0.10.4"
}
## 连接字符串
始终使用环境变量:
typescript
// 用于 HTTP 查询
import { neon } from "@neondatabase/serverless";
const sql = neon(process.env.DATABASE_URL!);
// 用于 WebSocket 连接
import { Pool } from "@neondatabase/serverless";
const pool = new Pool({ connectionString: process.env.DATABASE_URL! });
**切勿硬编码凭据:**
typescript
// 避免
const sql = neon("postgres://username:
[email protected]/neondb");
## 使用 `neon` 函数进行 HTTP 查询
非常适合无服务器/边缘环境中的简单“一次性”查询。使用 HTTP `fetch` - 是单次查询的最快方法。
### 参数化查询
使用标记模板字面量进行安全的参数插值:
typescript
const [post] = await sql`SELECT * FROM posts WHERE id = ${postId}`;
对于手动构建的查询:
typescript
const [post] = await sql.query("SELECT * FROM posts WHERE id = $1", [postId]);
**切勿拼接用户输入:**
typescript
// 避免: SQL 注入风险
const [post] = await sql("SELECT * FROM posts WHERE id = " + postId);
### 配置选项
typescript
// 将行作为数组而不是对象返回
const sqlArrayMode = neon(process.env.DATABASE_URL!, { arrayMode: true });
const rows = await sqlArrayMode`SELECT id, title FROM posts`;
// rows -> [[1, "First Post"], [2, "Second Post"]]
// 获取完整结果,包括行数和字段元数据
const sqlFull = neon(process.env.DATABASE_URL!, { fullResults: true });
const result = await sqlFull`SELECT * FROM posts LIMIT 1`;
// result -> { rows: [...], fields: [...], rowCount: 1, ... }
## WebSocket 连接