如何将CSV导入sanity.io

时间:2017-12-13 09:33:21

标签: javascript csv content-management-system sanity

我是业余爱好程序员,探索新无头CMS健全的免费版本(www.sanity.io)。

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

不要解释我自己的项目,而是让我使用捆绑的电影工作室作为一个例子:假设我想添加一层信息,电影制片厂制作电影。我有一个包含工作室列表的CSV文件,列名为姓名,国家,网页,CEO,电影。其中final是一个包含该studio的电影名称的数组。我想导入这个CSV来创建一个新的内容类型是studio,其中填充了工作室列表,电影数组是引用的位置,而不是文本。 / p>

任何人都可以帮助我理解我应该怎样做点击吗?

1 个答案:

答案 0 :(得分:1)

目前无法将数据直接从CSV文件导入Sanity。仍然,实现你想要的是非常直接的。简而言之,这是你想要做的:

  1. 解析CSV文件
  2. 构造传入数据以匹配您的架构
  3. 将新文档写入换行符分隔的JSON文件
  4. 将该文件导入Sanity
  5. 说出名为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标志),而不会出现重复。