javascript - SvelteKit:如何在不使用端点的情况下调用mongodb?

标签 javascript mongodb api svelte sveltekit

(1/9/2023) 更新:SvelteKit 现在支持 server only load functionsForm 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/

相关文章:

javascript - iOS 上的 Safari 在 javascript 执行期间抛出 SyntaxError,但在任何其他设备/浏览器上都不会

javascript - If 语句 js 中有多个内容

node.js - 使用 Mongoose (MongoDB) 查询嵌套文档

api - 使用 Firebase OAuth 保护 RESTful API?

android - REST 和 JSON API 之间的区别

javascript - Jquery - 从选择框进行数组操作

javascript - 异步地理定位 API 和 jQuery 延迟对象

c# - 在 C# 中构建(转义)JavaScript 正则表达式

node.js - 我如何实现将数据从mongodb流传输到elasticsearch的 Node JS worker?

azure - 将 Azure AD 身份验证集成到由 API 和 MVC 组成的现有项目时,我应该使用什么方法?