Можно ли очистить node.js требуемый кеш, используя express. js? - PullRequest
0 голосов
/ 07 апреля 2020

Я написал node.js небольшое приложение для себя, которое использовало небольшой код js, чтобы очистить требуемый кеш перед обработкой запроса:

let clearCache
if (process.env.NODE_ENV === 'development') {
  const {cache} = require
  clearCache = (except) => {
    for (let key in cache)
      if (!except.includes(key) && key.indexOf('/node_modules/') === -1)
        delete cache[key]
  }
} else {
  clearCache = () => {}
}

const { createServer } = require('http')
const persistentPaths = ['/path/to/my/db/file']
createServer((req, res) => {
  clearCache(persistentPaths)
  require('./handleRequest')(req, res)
}).listen(3000, () => {})

Я считаю, что это самый эффективный способ работы с приложением в развитие.

Когда я меняю код, он применяется немедленно, и это работало нормально для меня.

Теперь я хотел бы работать с express. js, и кажется, что его невозможно использовать. этот подход.

Хорошо, похоже, это вопрос с автоответчиком, и мне нужно использовать nodemon.

Но я действительно не хочу использовать инструмент, который будет смотреть все файлы и будет перезапустить весь сервер. Боюсь, что это будет намного медленнее.

В моем примере вы можете видеть, что я перезагружаю файлы, кроме файла db, поэтому мое разрабатываемое приложение подключается к базе данных только один раз и сохраняет это соединение. В случае использования приложения nodemon необходимо также загрузить весь код node_modules, каждый раз при изменении кода устанавливать новое соединение с БД, возможно, оно будет каждый раз подключаться к postgres и к redis.

Вопрос: я могу не тот, кто делает это таким образом, есть ли решения для перезагрузки модулей для express. js?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вам не нужно писать свой утилитар. Вы можете использовать модуль как chokidar для этого. Вы можете указать каталог и игнорировать его одновременно.

Вы можете перезагрузить часы обратного вызова.

Пример оттуда вики: : https://github.com/paulmillr/chokidar

const chokidar = require("chokidar");

// Full list of options. See below for descriptions.
// Do not use this example!
chokidar.watch("file", {
  persistent: true,

  ignored: "*.txt",
  ignoreInitial: false,
  followSymlinks: true,
  cwd: ".",
  disableGlobbing: false,
  awaitWriteFinish: {
    stabilityThreshold: 2000,
    pollInterval: 100,
  },

  ignorePermissionErrors: false,
  atomic: true, // or a custom 'atomicity delay', in milliseconds (default 100)
});
// One-liner for current directory
chokidar.watch(".").on("all", (event, path) => {
  // Reload module here.
});
0 голосов
/ 07 апреля 2020

Сделал это! Буду рад, если вы поделитесь своими мыслями по этому поводу.

Поскольку я могу гуглить только решения nodemon и chokidar, возможно, я делаю что-то странное, вот мое решение:

server.ts :

import express from 'express'
const app = express()
const port = 3000

app.listen(port, () =>
  console.log(`Example app listening at http://localhost:${port}`)
)

if (process.env.NODE_ENV === 'development') {
  const {cache} = require
  const persistentFiles: string[] = []
  const clearCache = (except: string[]) => {
    for (let key in cache)
      if (!except.includes(key) && key.indexOf('/node_modules/') === -1)
        delete cache[key]
  }
  app.use((req, res, next) => {
    clearCache(persistentFiles)
    const {router} = require('config/routes')
    router.handle(req, res, next)
  })
} else {
  const router = require('config/routes')
  app.use(router.handle)
}

И rout.ts:

import {Router, Request, Response} from 'express'
export const router = Router()

router.get('/', function (req: Request, res: Response) {
  res.send('Hello world')
})

Использование: NODE_ENV = разработка NODE_PATH = sr c узел src / server. js

( моя IDE компилирует ts до js во время редактирования и помещает его прямо там, если вы используете код VS, я думаю, это может быть более сложным)

...