如何在边缘计算环境下使用Postgres
深入了解如何使用Neon的无服务器驱动器与Vercel Edge Functions
翻译自:https://neon.tech/blog/how-to-use-postgres-at-the-edge
如何在边缘使用Postgres 深入了解如何使用Neon的无服务器驱动器与Vercel Edge Functions
在这个帖子中,我想介绍Neon的无服务器驱动器,它适用于与Vercel Edge Functions一起使用。我将解释如何将其与Next.js和免费的Neon无服务器Postgres数据库一起使用。
这是我创建的一个演示,我称之为Ping Thing。
当用户点击Ping时,应用程序会向部署在Vercel上的Edge Function发送请求,从请求中提取地理位置数据并发布到Neon数据库。我添加了一个3D地球来可视化旅程,并计算了一些关于请求的统计数据。
给它一个Ping,看看你的数据旅程。
我可以在边缘使用普通的Postgres吗?
简短的答案是不行,目前还不行。主要原因是,Postgres连接是通过TCP/IP建立的,一般来说,“边缘”环境如基于V8隔离的Vercel Edge Functions并不支持TCP。
我可以在边缘使用Neon无服务器Postgres吗?
可以,原因如下。原生Postgres将计算和存储耦合在一起,但Neon将它们分开了。Neon的无服务器驱动器是node-postgres(即pg)的替代品。你对pg了解和喜爱的一切都将继续按预期工作,任何与pg兼容的库也是如此。不同之处在于我们处理连接的方式。
无服务器驱动器可以使用HTTP或WebSockets连接到Neon代理,该代理转而建立到Postgres的TCP连接。这使得Neon成为在边缘环境中工作时的一个很好的解决方案。
在下面的示例中,我将向您展示如何将Neon的无服务器驱动器与Next.js API路由一起使用。
要开始,请注册Neon,然后按照我们的“创建你的第一个项目”指南操作。你也可能想看看我们文档中的这个指南:使用Neon的SQL编辑器进行查询。
一旦你设置好了数据库,将连接字符串保存到你的Next.js .env
文件中,并将其命名为DATABASE_URL
。
Neon的无服务器驱动器
要开始,请安装该包。
npm install @neondatabase/serverless
创建API路由
添加到pages/api
的任何文件都将被视为API端点,你可以在Next.js文档中了解更多关于API路由的信息。
你需要将table_name更改为你在数据库中创建的表名。
import { neon } from '@neondatabase/serverless';
export default async function handler() {
const sql = neon(process.env.DATABASE_URL);
const response = await sql`SELECT * FROM table_name`;
return Response.json({
message: 'A Ok!',
data: response,
});
}
export const config = {
runtime: 'edge',
};
就是这样!在边缘使用Postgres。
在上面的示例中,使用neon
导出,你正在使用SQL-over-HTTP进行查询。这对于单次查询非常合适,但如果你想在单个连接中执行多个查询,你可能想看看使用WebSockets的Pool或Client。
Pool和Client是同一个npm包的一部分,你可以这样使用Pool。
import { Pool } from '@neondatabase/serverless';
export default async function handler(req, ctx) {
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const response = await pool.query('SELECT * FROM table_name');
ctx.waitUntil(pool.end());
return Response.json({
message: 'A Ok!',
data: response.rows,
});
}
export const config = {
runtime: 'edge',
};
在一个包中灵活使用HTTP或WebSockets非常有帮助,这里有一篇很好的博客文章,我的同事Raouf Chebri在其中更详细地解释了这两种方法:HTTP与WebSockets:你的Postgres查询在边缘应该使用哪种协议
好问题,现在你在边缘,你要做什么?希望不仅仅是返回hello world!
使用@vercel/edge获取地理位置信息
我一直在研究的一个领域是使用Vercel的地理位置信息。你可以使用这个方便的小助手包来查看传入请求的地理位置信息。
要开始,请安装该包。
npm install @vercel/edge
在Neon中存储用户的地理位置数据
下面的代码片段是一个示例,展示了如何从地理位置助手函数中解构用户的country
、city
、latitude
和longitude
,以及一个INSERT
语句,将数据添加到名为locations
的表中。
import { neon } from '@neondatabase/serverless';
import { geolocation } from '@vercel/edge';
export default async function handler(req) {
const sql = neon(process.env.DATABASE_URL);
const { country, city, latitude, longitude } = geolocation(req);
await sql('INSERT INTO locations (country, city, latitude, longitude) VALUES ($1, $2, $3, $4)', [ country, city, latitude, longitude, ]);
return Response.json({ message: 'A Ok!', });
}
export const config = { runtime: 'edge', };
这是用于创建locations
表的模式。
CREATE TABLE locations ( id SERIAL PRIMARY KEY, country VARCHAR, city VARCHAR, latitude DECIMAL, longitude DECIMAL );
你可以使用这种方法来捕获有关你的网站访问者的信息,有点像“轻量级”的Google Analytics,或者也许在注册新闻通讯时提交地理位置数据,这样你就可以开始构建你的用户基础的图像。
或者,像我所做的,使用这些信息来显示数据在数据库之间和数据库之外的旅程。
设置Postgres数据库从未如此简单或快速(约2秒),并且使用Neon的无服务器驱动器,你可以使用Edge Functions在你的网站或应用程序中读写数据。如果你想亲自尝试,请在neon.tech上注册。
如果觉得这篇文章有见地,不妨给我的 Saasfly 项目点个 Star ⭐️,或者分享给更多对开源感兴趣的朋友们。感谢支持!
---------------------
本内容依据 CC BY-NC-SA 4.0 DEED 许可证进行授权。转载请附上出处链接。