使用函数传参导入mongoose model模型总是失败 提示undefined?

作者站长头像
站长
· 阅读数 11

我在database.js中使用函数传参的形式require模块 可是在data.js中引入使用时总是提示模块undefined 这是怎么回事啊?贴下代码database.js

module.exports.getDatabase = function () {
  var models = {}

  // 读取所有模型文件
  return new Promise((resolve) => {
    fs.readdir(modelsPath, function (err, files) {

      // console.log("开始加载 ORM 模型层文件 ");
      for (let i = 0; i < files.length; i++) {
        let modelPath = files[i]
        let modelName = files[i].substring(0, files[i].lastIndexOf('.'))
        console.log("加载模型 %s", modelPath);
       *models[modelName] = model => {
          console.log('ok')
          require(path.join(process.cwd(), '/models/', model))
        }*
        //models[modelName] = modelPath
      }
      global.models = models
      console.log("ODM 模型加载完成");
      resolve(global)
      if (err) {
        reject(err)
      }
    })

  })
}

data.js

module.exports.destroy = async function (modelName, id, cb) {
  //由于databaseModule.getDatabase()中用到了readdir方法 该方法是异步方法
  //需要使用await语法糖等待该异步函数执行完成 否则db是undefined
  let db = await databaseModule.getDatabase();
  console.log(db.models)
  let modelFunc = db.models[modelName]
  console.log(modelFunc)
  const Model = modelFunc(modelName)

  //const Model = require(path.join(process.cwd(), '/models/', modelName))

  Model.findByIdAndDelete(id, (err, obj) => {
    if (err) {
      return cb("删除失败", null);
    }
    return cb(null, obj);
  })


}
回复
1个回答
avatar
test
2024-07-05

你稍微调整一下代码结构就行了。

const fs = require("fs");
const path = require("path");
const modelsPath = path.join(__dirname, "models");

module.exports.getDatabase = async function () {
  var models = {};

  // 读取所有模型文件
  const files = await fs.promises.readdir(modelsPath);
  // console.log("开始加载 ORM 模型层文件 ");
  for (let i = 0; i < files.length; i++) {
    let modelPath = files[i];
    let modelName = files[i].substring(0, files[i].lastIndexOf("."));
    console.log("加载模型 %s", modelPath);
    models[modelName] = require(path.join(modelsPath, modelPath));
  }
  global.models = models;
  console.log("ODM 模型加载完成");

  return global;
};

然后,修改 data.js 文件用新的 getDatabase 函数:

const databaseModule = require("./database");

module.exports.destroy = async function (modelName, id, cb) {
  //由于databaseModule.getDatabase()中用到了readdir方法 该方法是异步方法
  //需要使用await语法糖等待该异步函数执行完成 否则db是undefined
  let db = await databaseModule.getDatabase();
  console.log(db.models);
  const Model = db.models[modelName];

  //const Model = require(path.join(process.cwd(), '/models/', modelName));

  Model.findByIdAndDelete(id, (err, obj) => {
    if (err) {
      return cb("删除失败", null);
    }
    return cb(null, obj);
  });
};

这样,你就可以在 data.js 里获取并使用 Mongoose 模型了。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容