Help us understand the problem. What is going on with this article?

Nuxt.jsで自分に外部APIを立てるのにexpressなどは必要がない

More than 1 year has passed since last update.

言語化が不得手なのでタイトルで正しく言い表せていないです。

Nuxt.jsを使っていても、サーバーにaxiosなどでPOSTして処理して結果を受け付けたいことってありますよね?

例えば
http://localhost:3000/index
から
http://localhost:3000/api
にPOSTしてレスポンスを受け取る。です。

「Nuxtが稼働しているサーバーでAPIサーバー?としても処理させる」
ことがしたいのです。

事前調査

nuxt axios apiなどで検索

Nuxtのチュートリアル的記事ではaxiosを使うものまではいくつか見つけられるものの、その多くは外部のテストデータ用のAPIだったりで、
「自分自身にAPIリクエストを投げる」
ものが見つけにくいなと思いました。

たとえば
5分で分かる! Nuxt.js + axiosでAPIを使ってみる。 | ネクストページブログ

npm install --save axios

インストールが完了したら、簡単なサンプルを作成して動きを見てみましょう。
APIは下記サイトからデータを取得してみます。
http://zipcloud.ibsnet.co.jp/api/search?zipcode=1040032&callback=jsonData

のような。
他にも私は過去に
Nuxt.js 入門 #1 – Nuxt.js によるブログアプリ制作 – chatbox blog
で少し勉強しましたが、こちらも

axios による APIデータの取得処理

最後に実際に API 通信を行って記事のデータを取得してみましょう。

今回は、JSON Placeholder というサイトで公開されている POST API を使用します。

http://jsonplaceholder.typicode.com/posts

と外部データを使うので、今回困ったように知見が溜まってなかったのですね。

見つけたけど使わなかった2つの方法

自サーバーでAPIを使う方法をなんとか調べた結果、2つ方法がありそうでした。

どちらもexpressを使う点は同じですが、

「expressのミドルウェアとしてnuxtを使う」

「Nuxtのサーバーミドルウェアとしてexpressを使う」
かの違いがありそうでした。

expressの一部としてNuxtを使うような例
マイクロサービスを作るのに、nuxt.jsが最高だった話 - Qiita

また、nuxtはexpressのミドルウェアとしてrendererをモジュールインポートして噛ませることができるので、APIサーバ+コンテンツプロバイダの構成を簡単に作ることができます。以下はテンプレートの初期設定例です。

実際Nuxt.jsとExpressでどうやってSSRやるか理解してましたか?自分はよくわかってなかったです【解説】 - Qiita

ExpressとNuxt.jsの連携
ポイント1. Nuxt.jsはExpressの中でミドルウェア的に使う

Nuxt.js でバックもフロントもこれ一本 - Qiita?
(この記事はちょっとどういった関係か読み取れませんでした)

Nuxtのサーバーミドルウェアの例
nuxt.js と serverMiddleware(express) で Twitterログインを実装した話 - Qiita


expressが必須というわけではないと思います。
他のものでもできそうですが、別途webサーバー機能がなんらかの形で必要という気配でした。

直感的にシンプルでなく構成が低レベルなプログラマには複雑にすぎる気がしたので、どうしてもexpress導入には及び腰でした。

手動で作れるserverMiddleware

しかし今ひとつドンピシャな記事が見つからず、expressもやむなしかと
nuxt-community/express-template: Starter template for Nuxt.js with Express.
を読んでいると、どうにもexpress部分が薄すぎる。

改めてまずは公式を読み直しました。

API: serverMiddleware プロパティ - Nuxt.js

Nuxt は内部で connect のインスタンスを作ります。 それはミドルウェアをスタックに登録したり、 外部サーバーを必要とせず に API などのルートを増やす事を可能にしてれくます。 connect 自体はミドルウェアで、登録されたミドルウェアは nuxt startexpress-template のようなプログラム的な使用法を持つミドルウェアとして使用されます。 Nuxt モジュール もまた this.addServerMiddleware() を使用して serverMiddleware を提供できます。

む、難しい…
もうそれぞれの用語がよくわからなかったのですが、
その下のカスタムサーバーミドルウェアのコードを読むと、なんとなくできそうに思えました。

module.exports = function (req, res, next) {
    // req は Node.js の HTTPリクエストオブジェクトです
    console.log(req.path)


    // res は Node.js の HTTPレスポンスオブジェクトです

    // next は 次のミドルウェアを呼び出すための関数です。
    // あなたのミドルウェアが最後でない場合、関数の最後で next を呼び出すのを忘れないでください!
    next()
}

Nuxt Config (nuxt.config.js):

serverMiddleware: [
    '~/api/logger'
]

お話としてはこのfunctionを実装したことでうまくいったよ。
で終わってしまうのですが。

ごくごく簡単なAPI機能ならばexpressなどは不要で自前でNodeの標準のHTTP.responseを書ければNuxt単体の機能で両立できる。
ということです。

余談

serverMiddleware
を知る前に、「Nuxtがサーバー側で動かすスクリプト」として探しているときにNuxtのMiddlewareという機能を見つけました。
Middlewareはサーバー側で動くものの、レンダリング前の機能で、Authなどに使うらしく思っていた機能と違っていました。

結果、serverMiddlewareという文字列を幾度か見かけてもスルーしていた気がするんですが、公式にも書かれている通り別物なのです。
が、初心者はこのようにやはり混同しがちなんだなあと思いました。


タイトルは必要ないと締めていますが、結局はexpressが必要になったりしました。悲しい。

参考

khsk
週一ぐらいでなにか書いていました。 いろいろお休み中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした