Как предотвратить «обязательное» выполнение кэша модуля в Node.js? - PullRequest
0 голосов
/ 05 апреля 2019

Я читал, и, насколько я понимаю, require автоматически выполняет и анализирует функции в модуле.

Есть ли способ предотвратить это?

Вариант использования прост;чтобы не иметь файла длинной строки 50000902931, я хочу переместить функции MySql в отдельный модуль (скажем, db_functions).

Но если require автоматически запускает все эти функции при запуске и снова , когда я вызываю функцию в app.js, информация в базе данных будет невероятно избыточной.Вот пример быстрого и простого примера:

app.js

const express = require('express')
const db_functions = require('./db_functions')

app.get(/save_a_new_visit', (req, res, next) => {
   db_functions.saveAVisit
     .then(() => {
        res.sendStatus(200)
     }
}); 

И

db_functions.js

const knex = require('knex')

function saveAVisit(knex) {
    console.log('You are saving a new visit')

    const visit = {
       visits: new Date()
    }

    return knex('this_is_an_example').insert(visit)
}

Когда я запускаю свой сервер, моя консоль записывает в журнал You are saving a new visit при запуске, а затем делает так снова , когда я посещаю конечную точку /save_a_new_visit.

Конечно, я хотел бы, чтобы только создать новое посещение, когда я посещаю страницу посещения.Правильно?Логично, я думаю.

А вот второй кривой мяч - это происходит только потому, что я развиваюсь локально?Как только проект будет размещен в Heroku или где-нибудь еще, эта двойная запись прекратится?Любая помощь, советы или заметки будут с благодарностью.

1 Ответ

0 голосов
/ 10 апреля 2019

Я бы предложил внести несколько изменений в ваш код следующим образом:

app.js

const app = require('express')
const db_functions = require('./db_functions')

app.get('/save_a_new_visit', (req, res, next) => {
    db_functions.saveAVisit()
      .then(() => {
          res.sendStatus(200)
          next()
      })
})

и

db_functions.js

const knex = require('knex')

module.exports.saveAVisit = async () => {
    console.log('You are saving a new visit')

    const visit = { visits: new Date() }

    return await knew('this_is_an_example').insert(visit)
}

В коде app.js я изменил имя вашей переменной импорта модуля Express, чтобы она соответствовала вашему объявлению маршрута RESTful под этими операторами импорта. Кроме того, я добавил вызов метода в вашу цепочку обещаний, вызвав функцию saveAVisit(). Я не указал никаких параметров для этой функции, потому что в действительности вам не нужно ничего определять в этой функции, как вы можете видеть во втором фрагменте кода. Наконец, я добавил вызов функции next(), так как вы включили ее в список параметров для определения маршрута, и если вы обращаете внимание на прохождение функции next(), вам следует убедиться, что вы вызываете ее.

В вашем коде db_functions.js я изменил определение вашей функции, включив в него префикс, чтобы эта функция была фактически доступна для любого импортирующего кода, который пытается импортировать этот модуль. Во-вторых, я определил функцию как асинхронную, используя ключевое слово async. Я делаю это так, чтобы вы могли использовать ключевое слово await, когда определяете реальную логику интерфейса базы данных в теле функции. Пожалуйста, ознакомьтесь с документацией async и await для получения дополнительной информации и примеров использования этих двух специальных ключевых слов. Я также удалил заданный вами параметр функции, потому что нет необходимости передавать экземпляр модуля knex, когда вы уже импортируете его вверху определения модуля. Наконец, поскольку я предполагаю, что функция knex.insert() является асинхронной, перед этим вызовом я добавил ключевое слово await, чтобы код ожидал ответа от базы данных, прежде чем вернуться к выполняющейся функции.

Внесение этих нескольких изменений в ваш код должно привести к тому, что код вашей базы данных больше не будет вызываться при импорте модуля. Если проблема не устранена после внесения этих изменений, возможно, в вашем приложении есть дополнительный код, который вы не предоставили выше, что приводит к такому поведению. Если это так, пожалуйста, отредактируйте свое сообщение и добавьте этот код, чтобы я мог помочь вам исправить его.

...