javascript - 如何将 CSV 文件导入 sanity.io

标签 javascript csv content-management-system sanity

我是一名业余程序员,正在探索新的 headless CMS sanity (www.sanity.io) 的免费版本。

尝试将数据上传/导入我的项目时遇到问题:有没有办法从 csv 文件导入数据?文档中的示例仅解释 json 文件:https://www.sanity.io/docs/content-studio/importing-data

我不解释我自己的项目,而是以捆绑的电影制片厂为例:假设我想添加一个信息层,即哪个电影制片厂制作了电影。我有一个包含工作室列表的 CSV 文件,列是名称、国家/地区、网页、CEO、电影。最后一个是一个数组,其中包含该工作室的电影名称。我想导入此 CSV 以创建一个新的内容类型作为工作室,其中填充了工作室列表,并且电影数组是引用,而不是文本。

任何人都可以帮助我了解我应该如何进行打击吗?

最佳答案

目前无法将数据直接从 CSV 文件导入 Sanity。尽管如此,实现你想要的还是非常简单的。简而言之,这是您想要做的:

  1. 解析CSV文件
  2. 构建传入数据以匹配您的模式
  3. 将新文档写入以换行符分隔的 JSON 文件
  4. 将该文件导入 Sanity

假设名为 studios.csv 的 CSV 文件看起来像这样:

NAME,WEBPAGE,MOVIES
Paramount,paramountstudios.com,Ghost in the Shell;Arrival
DreamWorks,dreamworksstudios.com,Ghost in the Shell;Minority Report;Transformers

下面的代码使用了csv-parser , 但如果你想使用其他包来吞噬 CSV,它仍然应该作为一个例子。

const csv = require('csv-parser')
const fs = require('fs')
const sanityClient = require('@sanity/client')
const client = sanityClient({
  projectId: 'my-project-id',
  dataset: 'my-dataset',
  useCdn: false
})

function appendToFile(document) {
  const docAsNewLineJson = `${JSON.stringify(document)}\n`
  fs.appendFileSync('ready-for-import.ndjson', docAsNewLineJson, {flag: 'a+'})
}

function moviesByTitles(titles) {
  return client.fetch('*[_type == "movie" && title in $titles]', {titles: titles})
}

fs.createReadStream('studios.csv')
  .pipe(csv())
  .on('data', data => {
    // Assuming movie titles are semi-colon separated
    const titles = data.MOVIES.split(';')
    // Fetch movies with these titles 
    moviesByTitles(titles).then(movies => {
      // Build a Sanity document which matches your Studio type
      const document = {
        _type: 'studio',
        name: data.NAME,
        webPage: data.WEBPAGE,
        movies: movies.map(movie => {
          return {
            _ref: movie._id,
            _type: 'reference'
          }
        })
      }
      // Append the document to a file for later import
      appendToFile(document)  
    )}
  })

您最终会得到包含准备导入的 Sanity 文档的 ready-for-import.ndjson 文件,因此现在您可以简单地:

sanity dataset import ready-for-import.ndjson <my-dataset>

在每个工作室中包含一个具有唯一、非随机值的 _id 字段可能会被证明是有用的,例如studio_${data.NAME.toLowerCase().replace(' ', '-')}。这将允许您多次导入文档(使用 --replace 标志),而不会重复。

关于javascript - 如何将 CSV 文件导入 sanity.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47789673/

相关文章:

javascript - Jquery 遍历输入字段的祖先

javascript - AJAX:列出目录的内容。无法解析网址

mysql - 在MySQL中获取多分隔字符串并转换为多条记录

node.js - 循环二进制 Float64Array 文件 - NodeJS

csv - 如何将CSV文件加载到AngularJS中的对象?

python - 企业网站和内网的框架/CMS建议(我必须说服总裁它很可靠!)

javascript - 在 Google App Engine 上重命名 index.html

php - 建议 : building a non-database driven simple CMS in PHP

sql - 如何设计具有修订历史的数据库?

javascript - Backbone.js,为什么这个回调被多次触发?