middleware(config)

It returns a connect middleware used by several Node.js web frameworks such as Express.

Type signature

function middleware(config: MiddlewareConfig): Middleware

The types of MiddlewareConfig and Middleware are like below.

interface MiddlewareConfig {
  channelAccessToken?: string;
  channelSecret: string;
}

type Middleware =
  ( req: http.IncomingMessage
  , res: http.ServerResponse
  , next: (err?: Error) => void
  ) => void

The Middleware type is defined according to the connect middleware itself. For the detail of the connect middleware, please refer to the connect documentation.

Usage

A very simple example of the middleware usage with an Express app is like below:

// globally
app.use(middleware(config))

// or directly with handler
app.post('/webhook', middleware(config), (req, res) => {
  req.body.events // webhook event objects
  req.body.destination // user ID of the bot (optional)
  ...
})

The middleware returned by middleware() parses body and checks signature validation, so you do not need to use validateSignature() directly.

You do not need to use body-parser to parse webhook events, as middleware() embeds body-parser and parses them to objects. Please keep in mind that it will not process requests without X-Line-Signature header. If you have a reason to use body-parser for other routes, please do not use it before the LINE middleware. body-parser parses the request body up and the LINE middleware cannot parse it afterwards.

// don't
app.use(bodyParser.json())
app.use(middleware(config))

// do
app.use(middleware(config))
app.use(bodyParser.json())

There are environments where req.body is pre-parsed, such as Firebase Cloud Functions. If it parses the body into string or buffer, do not worry as the middleware will work just fine. If the pre-parsed body is an object, please use validateSignature() manually with the raw body.

About building webhook server, please refer to Webhook.