Nuxtjs 和 Sanity CMS - $sanity.fetch() returns asyncData 中的页面更改为空
Nuxtjs and Sanity CMS - $sanity.fetch() returns null on page change in asyncData
我将 NuxtJS 与 Sanity CMS 结合使用。
我设置了几个页面组件,其中每个页面组件都使用 asyncData 挂钩从 CMS 获取数据以显示页面。
我的页面组件大部分看起来像这样,但有不同的 groq
查询:
<script>
import { groq } from '@nuxtjs/sanity';
export default {
async asyncData({ $sanity }) {
const query = groq`
*[_type == "about"][0]
`;
const about = await $sanity.fetch(query);
console.log(about); //returns proper data on page load, returns null on page change
return { about };
}
};
</script>
在初始页面加载或整个页面刷新时,页面加载正常 - 对于我的应用程序中的所有页面。
使用本地开发服务器时,当我使用 <NuxtLink>
更改页面时,遵循此模式的每个页面都无法使用 $sanity.fetch()
方法 return 数据。每次 returns null
。这让我真的很难开发页面转换。
我可以尝试将它们转换为使用 fetch
挂钩,但是据我所知,这是 asyncData
.
的正确用例
在版本控制方面,这是我的 package.json
{
//...,
"dependencies": {
"@nuxtjs/sanity": "^0.9.4",
"@nuxtjs/style-resources": "^1.2.0",
"@nuxtjs/svg": "^0.1.12",
"@sanity/asset-utils": "^1.1.5",
"@sanity/client": "^2.13.0",
"@sanity/image-url": "^0.140.22",
"axios": "^0.21.1",
"core-js": "^3.15.1",
"nuxt": "^2.15.7",
"nuxt-gsap-module": "^1.3.2",
"vue-youtube": "^1.4.0"
},
"devDependencies": {
"@babel/eslint-parser": "^7.14.7",
"@nuxtjs/eslint-config": "^6.0.1",
"@nuxtjs/eslint-module": "^3.0.2",
"eslint": "^7.29.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-nuxt": "^2.0.0",
"eslint-plugin-vue": "^7.12.1",
"fibers": "^5.0.0",
"prettier": "^2.3.2",
"sass": "^1.35.2",
"sass-loader": "^10.2.0"
}
}
就我的 nuxt 配置而言,这里是:
export default {
// Target: https://go.nuxtjs.dev/config-target
target: 'static',
// Global page headers: https://go.nuxtjs.dev/config-head
head: {
titleTemplate: '%s - My great project',
title: 'My Project',
htmlAttrs: {
lang: 'en'
},
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' }
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
// Global CSS: https://go.nuxtjs.dev/config-css
css: ['@/styles/main.scss'],
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: [
{ src: '~/plugins/sanity-image-builder.js' },
{ src: '~/plugins/sanity-asset-url.js' },
{ src: '~/plugins/youtube.js', ssr: false }
],
// Auto import components: https://go.nuxtjs.dev/config-components
components: true,
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
buildModules: [
// https://go.nuxtjs.dev/eslint
'@nuxtjs/eslint-module',
'@nuxtjs/sanity/module',
'@nuxtjs/style-resources',
'nuxt-gsap-module'
],
// Modules: https://go.nuxtjs.dev/config-modules
modules: ['@nuxtjs/svg'],
// Build Configuration: https://go.nuxtjs.dev/config-build
build: {
loaders: {
scss: { sourceMap: false },
sass: { sourceMap: false }
}
},
generate: {
fallback: true
},
// Override santity config here.
privateRuntimeConfig: {
sanity: {
token: process.env.SANITY_TOKEN
}
},
styleResources: {
scss: ['./styles/*.scss']
}
};
当您使用 privateRuntimeConfig
时,您的环境变量将仅在 SSR 上可用。因此,当您第一次访问该页面时,您确实可以访问它。
然后,当您导航时(仅限客户端),您将无法再在您的客户端上访问它。如 official documentation.
中所述
Sanity's documentation说的是privateRuntimeConfig
,同时我也想知道他们的token是不是只针对SSR的。通常,您确实有一个可以通过 publicRuntimeConfig
密钥公开的 public 令牌。
Discord 上有一个 headless
频道,可在此处找到:https://discord.gg/H4hJBMCK
否则,发帖 a Github issue 可能会让您找到 Daniel 的答案。
但Sanity有可能只是为了获取服务器上的内容,不确定。
有一个 setToken 方法,但是这个方法只针对 req
,这意味着它不适合 target: static
构建?
编辑:nvm Ovi
已实现,如下所示:https://github.com/nuxt-community/sanity-module/issues/99#issuecomment-813993013
这个应该可以用!
PS:我在调查问题时写的有点像。对不起,如果它有点乱。告诉我最新的解决方案是否有效,我会编辑我的答案。
我将 NuxtJS 与 Sanity CMS 结合使用。
我设置了几个页面组件,其中每个页面组件都使用 asyncData 挂钩从 CMS 获取数据以显示页面。
我的页面组件大部分看起来像这样,但有不同的 groq
查询:
<script>
import { groq } from '@nuxtjs/sanity';
export default {
async asyncData({ $sanity }) {
const query = groq`
*[_type == "about"][0]
`;
const about = await $sanity.fetch(query);
console.log(about); //returns proper data on page load, returns null on page change
return { about };
}
};
</script>
在初始页面加载或整个页面刷新时,页面加载正常 - 对于我的应用程序中的所有页面。
使用本地开发服务器时,当我使用 <NuxtLink>
更改页面时,遵循此模式的每个页面都无法使用 $sanity.fetch()
方法 return 数据。每次 returns null
。这让我真的很难开发页面转换。
我可以尝试将它们转换为使用 fetch
挂钩,但是据我所知,这是 asyncData
.
在版本控制方面,这是我的 package.json
{
//...,
"dependencies": {
"@nuxtjs/sanity": "^0.9.4",
"@nuxtjs/style-resources": "^1.2.0",
"@nuxtjs/svg": "^0.1.12",
"@sanity/asset-utils": "^1.1.5",
"@sanity/client": "^2.13.0",
"@sanity/image-url": "^0.140.22",
"axios": "^0.21.1",
"core-js": "^3.15.1",
"nuxt": "^2.15.7",
"nuxt-gsap-module": "^1.3.2",
"vue-youtube": "^1.4.0"
},
"devDependencies": {
"@babel/eslint-parser": "^7.14.7",
"@nuxtjs/eslint-config": "^6.0.1",
"@nuxtjs/eslint-module": "^3.0.2",
"eslint": "^7.29.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-nuxt": "^2.0.0",
"eslint-plugin-vue": "^7.12.1",
"fibers": "^5.0.0",
"prettier": "^2.3.2",
"sass": "^1.35.2",
"sass-loader": "^10.2.0"
}
}
就我的 nuxt 配置而言,这里是:
export default {
// Target: https://go.nuxtjs.dev/config-target
target: 'static',
// Global page headers: https://go.nuxtjs.dev/config-head
head: {
titleTemplate: '%s - My great project',
title: 'My Project',
htmlAttrs: {
lang: 'en'
},
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' }
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
// Global CSS: https://go.nuxtjs.dev/config-css
css: ['@/styles/main.scss'],
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: [
{ src: '~/plugins/sanity-image-builder.js' },
{ src: '~/plugins/sanity-asset-url.js' },
{ src: '~/plugins/youtube.js', ssr: false }
],
// Auto import components: https://go.nuxtjs.dev/config-components
components: true,
// Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
buildModules: [
// https://go.nuxtjs.dev/eslint
'@nuxtjs/eslint-module',
'@nuxtjs/sanity/module',
'@nuxtjs/style-resources',
'nuxt-gsap-module'
],
// Modules: https://go.nuxtjs.dev/config-modules
modules: ['@nuxtjs/svg'],
// Build Configuration: https://go.nuxtjs.dev/config-build
build: {
loaders: {
scss: { sourceMap: false },
sass: { sourceMap: false }
}
},
generate: {
fallback: true
},
// Override santity config here.
privateRuntimeConfig: {
sanity: {
token: process.env.SANITY_TOKEN
}
},
styleResources: {
scss: ['./styles/*.scss']
}
};
当您使用 privateRuntimeConfig
时,您的环境变量将仅在 SSR 上可用。因此,当您第一次访问该页面时,您确实可以访问它。
然后,当您导航时(仅限客户端),您将无法再在您的客户端上访问它。如 official documentation.
中所述Sanity's documentation说的是privateRuntimeConfig
,同时我也想知道他们的token是不是只针对SSR的。通常,您确实有一个可以通过 publicRuntimeConfig
密钥公开的 public 令牌。
Discord 上有一个 headless
频道,可在此处找到:https://discord.gg/H4hJBMCK
否则,发帖 a Github issue 可能会让您找到 Daniel 的答案。
但Sanity有可能只是为了获取服务器上的内容,不确定。
有一个 setToken 方法,但是这个方法只针对 req
,这意味着它不适合 target: static
构建?
编辑:nvm Ovi
已实现,如下所示:https://github.com/nuxt-community/sanity-module/issues/99#issuecomment-813993013
这个应该可以用!
PS:我在调查问题时写的有点像。对不起,如果它有点乱。告诉我最新的解决方案是否有效,我会编辑我的答案。