【发布时间】:2019-04-05 05:20:50
【问题描述】:
我一直在阅读,据我了解,require 自动执行并解析模块中的函数。
有什么办法可以防止这种情况发生吗?
用例很简单;为了防止自己拥有一个 50000902931 长行文件,我想将 MySql 函数移动到一个单独的模块(例如,db_functions)。
但是如果require 在启动时自动运行所有这些函数,并且再次 当我调用app.js 中的函数时,数据库信息将非常冗余。这是一个快速简单的示例 sn-p:
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 或任何地方,这种双重写作会停止吗?任何帮助、提示或注释将不胜感激。
【问题讨论】:
-
我想知道的第一件事是您当前从您的应用程序中看到的行为是什么?
require所做的唯一一件事就是将所有require引用解析到每个模块的底部,以便所有引用模块的初始版本仅加载一次。在应用程序逻辑执行这些功能之前,不会执行任何给定模块中定义的各个功能。所以我想知道您是否看到了一些奇怪的行为,或者只是担心根据您的研究发生的事情。 -
我想我看到了奇怪的行为 - 引用的模块已加载,并且在加载时也执行。我不确定这是否是“奇怪”的行为(我对 Node.js 还很陌生,所以我认为事情就是这样)。当我启动我的服务器时,我所有的导出函数都在运行——只要我启动服务器。然后,当我导航到特定网页时,该功能再次运行。在应用程序调用中运行的函数有效,但该函数似乎也在简单的应用程序启动时运行。
-
你没有在
db_functions.js上导出任何东西 -
对,对不起,忘了添加那行。我稍后会编辑它。
标签: javascript node.js express async-await knex.js