fastdocs: Application crashes at invalid endpoint
Published: 2020-10-18 18:51:54

## What is fastdocs?
Automatically generated [Docsify](https://github.com/docsifyjs/docsify/) flavored documentation sites for markdown files! This is a README-as-a-Service project, spin up beautiful versions of your documentation in seconds!

__how to use__:
To render documentation from https://github.com/cheeriojs/cheerio, where the :user is cheeriojs and :repo is cheerio you can simply go to https://fastdocs.io/cheeriojs/cheerio to view the rendered documentation!

## Getting start
This week, I just wandering around on the github to find interesting repo. All of sudden, I came across with fastdoc project. [aemmadi](https://github.com/aemmadi) is looking for help to fix the endpoint timeout bug. So I let him know I would like to work on this.

## Issue: Application crashes at invalid endpoint
[If the :user/:repo is invalid, the application times out and crashes](https://github.com/aemmadi/fastdocs/issues/22)
The issue seemed simple, at the very first time, I guessed "the bug is from somewhere like `request`. So I started to dig in there first.

## Step 1: find out what is the problem
Unfortunately, this program doesn't support unit test feature, so I need to manually test it first. I passed some wrong user name and repo name like /cheeriojs -> cherrio, /cheerio -> cheerr.

After, testing couple time I ended up finding where the problem coming from
```
app.get("/:user/:repo", (req, res) => {
  const user = req.params.user;
  const repo = req.params.repo;

  util.compileDocs(user, repo).then(() => {
    util.serveDocs(app, user, repo);
    res.redirect(`/docs/${user}/${repo}/`);
  });
});
```
In the `app.get()`, `util.compileDocs(user, repo)` crashed when invalid user and repo. I guessed there should be API request inside of the `util.compileDocs(user, repo)` and the request 
would be something wrong.

## Step 2: fix axios request
In the util.js file, `compileDocs` run `getReadme`
```
async function compileDocs(user, repo) {
  await getReadme(user, repo);
}
```
the `getReadme` looked like this,
```
async function getReadme(user, repo) {
  mainConfig.user = user;
  mainConfig.repo = repo;

  const readme = await axios.get(
    `https://api.github.com/repos/${user}/${repo}/readme`
  );
```
I found out that `axios` was throwing error when `user` and `repo` are invalid, but there is no try catch block. So I simply added try and catch block.

After changing, now there is no error, instead just default 404 error message `cannot get :/user/repo`. But the bug was only about back-end feature, so I thought it was kind of finished. 

See the [changes](https://github.com/klee214/fastdocs/commit/fc72ead013b708b5003b7bc4bf75a15b95a9a1f6) 

I tested a lot of times, then finally decided it was good to go. I made a [PR](https://github.com/aemmadi/fastdocs/pull/23) request for him 

## New request! -- add 404 page
Couple days later, he sent me a message that he would like for me to add front-end feature too. He wants to get benefit from [docsify 404 error page](https://docsify.js.org/#/configuration?id=notfoundpage).

## Added a customized 404 page
After reviewing the documentation, I finally understand how to add this. In the HTML file added this:
```
window.$docsify = {
  notFoundPage: 'my404.md',
};
```
then, make a 'my404.md' in docs directory. 

And I changed the `app.get` to fit the changes
```
if(user && repo){
      res.redirect(`/docs/${user}/${repo}/`);
    }else{
      res.sendFile(path.resolve(__dirname, './docs/index.html'));
    }
```
However, it didn't work at all. It just kept showing the default `cannot get` message. For some reason, this change was ignored.

## The problem
Spending some hours, I figured out what the problem was. This is not because of my change, but it came from the way it was coded before. Whenever user change and `get request` url, it just `redirect` to the url 
```
util.compileDocs(user, repo).then(() => {
    ...
    res.redirect(`/docs/${user}/${repo}/`); // the problem
    ...
  });
```
Also, `res.sendFile(path.resolve(__dirname,'./docs/index.html'));` just send a html file, so it would not run 
```
window.$docsify = {
  notFoundPage: 'my404.md',
};
```
in the html file.

So I suggest couple another way to add 404 page without docsify, and ask for some more information about docsify features, and let him know about [this](https://github.com/aemmadi/fastdocs/pull/23#issuecomment-709624277).

## To be updated
We are still working on this. At this moment, I am waiting for this response. If there is further update, I will update the blog as well