Как обслуживать файл stati c, если он существует, и файл со значениями по умолчанию, если он не существует, с помощью koa. js - PullRequest
0 голосов
/ 05 мая 2020

Я хочу модифицировать фреймворк. На данный момент он создает файл robots.txt со значениями по умолчанию. Сначала он должен проверить, существует ли robots.txt, а если нет, создать его, как раньше.

В настоящий момент код выглядит следующим образом:

import Koa from "koa";
import { get } from "koa-route";
import serve from "koa-static";
import mount from "koa-mount";
import React from "react";
import { Context } from "@frontity/types";

export default ({ packages }): ReturnType<Koa["callback"]> => {
  const app = new Koa();

  // Serve static files.
  app.use(mount("/static", serve("./build/static")));

  // Default robots.txt.
  app.use(
    get("/robots.txt", (ctx) => {
      ctx.type = "text/plain";
      ctx.body = "User-agent: *\nDisallow:";
    })
  );

  // Ignore HMR if not in dev mode or old browser open.
  const return404 = (ctx: Context) => {
    ctx.status = 404;
  };
  app.use(get("/__webpack_hmr", return404));
  app.use(get("/static/([a-z0-9]+\\.hot-update\\.json)", return404));

  // Return Frontity favicon for favicon.ico.
  app.use(get("/favicon.ico", serve("./")));

  // Frontity server rendering.
  app.use(async (ctx, next) => {
  ...
  });

  return app.callback();
};

Я мог бы обслуживать его как favicon.ico обслуживается: app.use(get("/robots.txt", serve("./")));, но я понятия не имею, как его сначала проверить, существует ли файл, и если нет, вернуть значение по умолчанию:

(ctx) => {
  ctx.type = "text/plain";
  ctx.body = "User-agent: *\nDisallow:";
})

1 Ответ

0 голосов
/ 06 мая 2020

Я проверяю наличие файла с помощью fs.existsSync, например:

import fs from "fs";

let hasRobotTxt = false;
if (fs.existsSync("./robots.txt")) {
  hasRobotTxt = true;
}

Затем обслуживаю его условно, например:

app.use(
  get(
    "/robots.txt",
    hasRobotTxt
      ? serve("./")
      : (ctx) => {
          ctx.type = "text/plain";
          ctx.body = "User-agent: *\nDisallow:";
        }
  )
);
...