如何使用 NestJS 查询 Sanity 客户端?

How to query Sanity client with NestJS?

现在我已经使用连接 Sanity 的 Vite 初始化了 React 应用程序。 一切正常,Sanity 客户端已连接,React 正在从 Sanity 获取数据,我可以毫无问题地接收它。

但问题是,如果我在连接 Sanity 的情况下部署 React 应用程序,那么我会将 projectIDsanity_token 泄漏到前端,当然我想避免这种情况。

所以我必须做一些后端 REST API,它将被 React 获取,然后我的 API 将获取 Sanity。我可以使用 Node.js 和 Express 毫无问题地做到这一点,但我决定我将使用 NestJS 并学习一些东西。

但是当谈到 NestJS 时,一切都有些不同。

在前面我有:

import sanityClient from '@sanity/client';

export const client = sanityClient({
  projectId: import.meta.env.VITE_SANITY_PROJECT_ID, 
  dataset: 'production',
  apiVersion: '2022-02-01', 
  useCdn: true,
  token: import.meta.env.VITE_SANITY_TOKEN
});

对于 NestJS,我发现了这样的东西:

import { Injectable } from '@nestjs/common';
import sanityClient, { SanityClient } from '@sanity/client';

@Injectable()
export class SanityService {
  public readonly client: SanityClient = sanityClient({
    projectId: process.env.SANITY_PROJECT_ID, 
    dataset: 'production',
    apiVersion: '2022-02-01', 
    useCdn: true,
    token: process.env.SANITY_TOKEN
  });
}

我的问题是,这是连接 Sanity 客户端的好方法吗? 如何使用指定的 GROQ 查询查询 Sanity 客户端?

到目前为止,我一直在前端使用它,但它在 NestJS 中不起作用:

const query = '*[_type == "blogPost"]';

    client.fetch(query)
      .then((data) => {
        setPosts(data);
      })
      .catch((err) => {
        console.log(err);
      })

事实证明,这是连接 Sanity 客户端的正确方法,我遇到了与此类似的问题 thread

解决方案与上面的线程相同。将 "esModuleInterop": true 添加到 tsconfig.json。

{
  "compilerOptions": {
    ...
    "esModuleInterop": true,
    ...
  }
}

然后请求数据到 sanity 客户端工作正常:

  @Get()
  async getAllPosts() {
    
    // initialize sanity instance
    const sanityService = new SanityService();

    // your query
    const query = '*[_type == "blogPost"]';

    try {
      const data = await sanityService.client.fetch(query);
      
      return data;

    } catch (error) {
      console.log(error.msg);
    }
  }