(1/9/2023) 更新:SvelteKit 现在支持 server only load functions和 Form actions向服务器发送请求。
我想调用我的数据库,但我不希望最终用户通过我设置的 API 端点来访问它。我想知道如何从 lib 文件夹中的文件调用我的数据库并返回那里的数据。当我尝试时,出现错误 global not Defined
:
lib/db.js:
import dotenv from "dotenv";
dotenv.config();
import { MongoClient } from "mongodb";
const uri = process.env["MONGODB_URI"];
const options = {
useUnifiedTopology: true,
useNewUrlParser: true,
};
let client;
let clientPromise;
if (!uri) {
throw new Error("Please add your Mongo URI to .env.local");
}
if (process.env["NODE_ENV"] === "development") {
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options);
global._mongoClientPromise = client.connect();
}
clientPromise = global._mongoClientPromise;
} else {
client = new MongoClient(uri, options);
clientPromise = client.connect();
}
export default clientPromise;
路线/项目/index.js:
import clientPromise from "$lib/db";
export async function get() {
const client = await clientPromise;
const db = client.db();
const data = await db.collection("items").find({}).toArray();
const items = data.map(({ name }) => ({ name }));
if (items) {
return {
body: {
items,
},
};
}
}
我的尝试: lib/stores/items.js
import clientPromise from "$lib/db";
import { writable } from "svelte/store";
export const items= writable([]);
const fetchItems = async () => {
const client = await clientPromise;
const db = client.db();
const data = await db.collection("items").find({}).toArray();
const items = data.map(({ name }) => ({ name }));
substances.set(items);
};
fetchItems();
在不同的地方尝试上述代码总是会在客户端中产生全局未定义
错误。
我发现有同样问题的人提出了一个问题,但我不知道如何创建帮助文件。
最佳答案
保护API是在后端完成的。通常它是服务器(如 NodeJS)或工具 Nginx/Apache(代理等)。您基本上是在寻找 Content-Security-Policy 主题,该主题是空洞的,但与 SvelteKit 无关。
顺便说一句,直接从前端调用数据库并不安全,也是不可能的。
关于javascript - SvelteKit:如何在不使用端点的情况下调用mongodb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70553571/