如何使用 NestJS 查询 Sanity 客户端?
How to query Sanity client with NestJS?
现在我已经使用连接 Sanity 的 Vite 初始化了 React 应用程序。
一切正常,Sanity 客户端已连接,React 正在从 Sanity 获取数据,我可以毫无问题地接收它。
但问题是,如果我在连接 Sanity 的情况下部署 React 应用程序,那么我会将 projectID
和 sanity_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);
}
}
现在我已经使用连接 Sanity 的 Vite 初始化了 React 应用程序。
一切正常,Sanity 客户端已连接,React 正在从 Sanity 获取数据,我可以毫无问题地接收它。
但问题是,如果我在连接 Sanity 的情况下部署 React 应用程序,那么我会将 projectID
和 sanity_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);
}
}