備忘録 – Notion APIをローカルのnodeから叩いてみよう

  • URLをコピーしました!

Notion API の ドキュメントの導入に書かれている内容を、Node.js / npm 初心者がやってみた備忘録です!

目次

Notion側の準備

  • データベースの準備
  • API認証情報の準備

データベースの準備

新規のデータベースを適当に作ります。

データの列の名前を後で使うので「Name」として設定しておきます。

そして、作成したテーブルのURLの、データベースIDをコピーしてメモしておきます。

https://www.notion.so/[この部分の英数字がデータベースID]?v=[この部分はいらない]

準備したデータベース

API認証情報の準備

https://www.notion.so/my-integrations から新しいインテグレーションを作ります。

作成したら、トークンをコピーしてメモしておきます。

PC側の準備

  • Node.jsが入っているか確認
node -v

Node.js がインストールされていない場合は https://nodejs.org/ja/ からLTSをインストールします。

APIを叩いてみる

https://developers.notion.com/docs を参考に、しつつ下記のようなファイルを用意します。

ドキュメントには .envの使い方が書いていないのですが、.index.jsに直接トークンを書かずに .envを使う想定でドキュメントが書かれているようだったので.envを使ってみます。

NOTION_KEY=[トークンをここに書きます]
NOTION_DATABASE_ID=[データベースIDをここに書きます]
{
  "name": "notion",
  "type": "module",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "@notionhq/client": "^1.0.1",
    "dotenv": "^16.0.0"
  } 
}
import 'dotenv/config'
import { Client } from "@notionhq/client"

const notion = new Client({ auth: process.env.NOTION_KEY })

const databaseId = process.env.NOTION_DATABASE_ID

async function addItem(text) {
  try {
    const response = await notion.pages.create({
      parent: { database_id: databaseId },
      properties: {
        Name: { 
          title:[
            {
              "text": {
                "content": text
              }
            }
          ]
        }
      },
    })
    console.log(response)
    console.log("Success! Entry added.")
  } catch (error) {
    console.error(error.body)
  }
}

addItem("Yurts in Big Sur, California")

※ index.js の properties の後に出てくる Name という文字ですが、これはデータベースの列の名前に合わせます。

↓こんな感じにファイルを作成したら

任意のフォルダ
├.env
├index.js
├package.json
├package-lock.json

このフォルダ上で下記の2つのコマンドを実行します。

npm install
node index.js

うまくいけば↓このようなメッセージが帰ってきて

{
  object: 'page',
  id: '************************',
  created_time: '2022-04-02T11:13:00.000Z',
  last_edited_time: '2022-04-02T11:13:00.000Z',
  created_by: { object: 'user', id: '******************************' },
  last_edited_by: { object: 'user', id: '******************************' },
  cover: null,
  icon: null,
  parent: {
    type: 'database_id',
    database_id: '*********************************'
  archived: false,
  properties: {
    'タグ': { id: '******', type: 'multi_select', multi_select: [] },
    Name: { id: 'title', type: 'title', title: [Array] }
  url: 'https://www.notion.so/***************************************'
}
Success! Entry added.

Notion側の項目が増えます!

うまくいかないとき

うまくいかないときはこんな感じのメッセージが帰ってきます。(これはトークンの指定が間違っていた時)

@notionhq/client warn: request fail { code: 'unauthorized', message: 'API token is invalid.' }
{"object":"error","status":401,"code":"unauthorized","message":"API token is invalid."}

おそらく下記のいずれかの原因なので、指定を見直す必要があります。

  • トークンの指定がうまくいっていない
  • データベースIDの指定がうまくいっていない
  • 列の名前の指定がうまくいっていない

サーバーで動かせるのか?

jsなので「webpack等で適切にバンドルしてhtmlで読み込んで、サーバーアップしたらブラウザで動かせるのでは」と考えて試してみたのですが、Notion APIは基本的にはブラウザからJavaScriptでたたくことはできないようです。

Access to fetch at 'https://api.notion.com/v1/pages' from origin 'https://deep-space.blue' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

※いろいろな対策をして使う方法もなくはないようですが…

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる