有没有办法取消 node.js 对 require 模块的缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法取消 node.js 对 require 模块的缓存相关的知识,希望对你有一定的参考价值。

参考技术A function (req, res)
try
var title = req.param('title'),
viewTemplate = 'path/to/template',
config = require('path/to/config') || ;

res.render(viewTemplate, config);
catch (e)
// handleErr('400', res);

;
它的功能是响应 ‘/:title’ URL, 用 ‘path/to/config’ 中的配置数据去渲染 ‘path/to/template’ 里的模板文件,返回页面。

调试的时候遇到一个有点麻烦的地方,就是修改了配置数据之后,必须重启服务器才能看到修改后的结果。

也就是 config = require('path/to/config') || 这个值因为 require 的时候模块缓存的存在,刷新页面的时候并不会动态去重新加载一次 ‘path/to/config.js’ 文件,导致这个文件的修改只能通过重启才能体现。

有没有方法可以取消 require 的时候的缓存呢?对我来说,如果可以在开发的时候取消这个,开发起来就方便很多了。

顺便,stackoverflow 上面貌似说不可能(http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate)。期盼大牛现身辟谣。
参考技术B function (req, res)
try
var title = req.param('title'),
viewTemplate = 'path/to/template',
config = require('path/to/config') || ;

res.render(viewTemplate, config);
catch (e)
// handleErr('400', res);

;
它的功能是响应 ‘/:title’ URL, 用 ‘path/to/config’ 中的配置数据去渲染 ‘path/to/template’ 里的模板文件,返回页面。

调试的时候遇到一个有点麻烦的地方,就是修改了配置数据之后,必须重启服务器才能看到修改后的结果。

也就是 config = require('path/to/config') || 这个值因为 require 的时候模块缓存的存在,刷新页面的时候并不会动态去重新加载一次 ‘path/to/config.js’ 文件,导致这个文件的修改只能通过重启才能体现。

有没有方法可以取消 require 的时候的缓存呢?对我来说,如果可以在开发的时候取消这个,开发起来就方便很多了。

顺便,stackoverflow 上面貌似说不可能(http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate)。期盼大牛现身辟谣。
参考技术C 可以尝试用javascript的delete语言特性试试,一般来说不需要释放对require模块的缓存,你的要求比较特别。本回答被提问者采纳

有没有办法在 node.js 中使用 Model.find() 查询和填充字段过滤器

【中文标题】有没有办法在 node.js 中使用 Model.find() 查询和填充字段过滤器【英文标题】:Is there any way to use Model.find() Querie with populated field filter in node.js 【发布时间】:2021-10-12 21:42:23 【问题描述】:

我正在使用这样的 Model.find() 查询

const model = require("../../models/product");

module.exports = async(filters) => 
        let data = Object.values(filters.data)[0]
        let field = Object.keys(filters.data)[0];
        const regex = new RegExp(escapeRegex(data), 'gi');
        return await model.find( $or: [
                [field]: regex ] ).populate("division_id").populate("type_id").populate("category_id").exec()
    
    //$or:[ '_id':objId, 'name':param, 'nickname':param ]
function escapeRegex(text) 
    return text.replace(/[-[\]()*+?.,\\^$|#\s]/g, "\\$&");
;

过滤器

在过滤器中,我正在发送 data : name : "a"

这是给所有名称以“a”开头的产品,这很好!

但现在我想获得具有特定划分的过滤结果

响应仅包括特定的部门产品

产品架构

_id: mongoose.Schema.Types.ObjectId,

division_id: type: mongoose.Schema.Types.ObjectId, ref: 'Division', required: [true, "Product Division Id is required"] ,

name: type: String, required: [true, "Product Name is required"] ,

部门架构

_id: mongoose.Schema.Types.ObjectId,

name: type: String, required: "Division Name is required" ,

【问题讨论】:

【参考方案1】:

尝试使用此处的示例:https://mongoosejs.com/docs/populate.html#query-conditions

所以我认为它应该是这样的:

return await model.find(
  $or: [
     [field]: regex  // By the way, if it's the only query in $or, you don't need $or
  ],

.populate(
  path: "division_id",
  match:  _id: <ObjectId> 
)
.populate("type_id")
.populate("category_id")
.exec();

第一个 .populate 将被扩展一点以包含特定匹配。在那里,您可以传递_id(例如,或name,根据您的架构)来匹配特定的部门。

【讨论】:

感谢您的回复......但我仍然收到错误“无法读取 null 的属性 '_id'” @user16452247 这必须在其他行,因为我的代码没有可为空的对象

以上是关于有没有办法取消 node.js 对 require 模块的缓存的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法取消 node.js 对 require 模块的缓存

有没有办法从 .js 文件自动安装 node.js 依赖项?

使用 Express/Node.js 和 Angular 处理取消的请求

有没有办法记录节点获取请求?

有没有办法在 node.js 中使用 Model.find() 查询和填充字段过滤器

将 CouchDB 与 Node.js 库一起使用