mongoose.connect 不是一个函数 - React Native

Posted

技术标签:

【中文标题】mongoose.connect 不是一个函数 - React Native【英文标题】:mongoose.connect is not a function - React Native 【发布时间】:2021-01-26 23:42:58 【问题描述】:

在弄乱我的护照会话并与它们一起实现 JWT 之后,我尝试运行我的应用程序,但遇到了一些我无法解决的错误:

ERROR TypeError: mongoose.connect 不是函数。 (在 'mongoose.connect(config.MongoURL, useNewUrlParser: true, 使用统一拓扑:真, 使用FindAndModify:假 )', 'mongoose.connect' 未定义)

ERROR Invariant Violation:Module AppRegistry 不是注册的可调用模块(调用runApplication)

ERROR Invariant Violation:Module AppRegistry 不是注册的可调用模块(调用runApplication)

让错误让我有点困惑的是,与我的 mongodb 的连接实际上是成功建立的,因为我可以在 mongoose.connect() 函数之后的承诺中 console.log(data) 没有任何错误都被捕获。我还尝试访问我的服务器端(使用 Postman)并执行一些使用我的数据库的 Get 和 Post 功能,并且请求也成功完成!

至于其他两个错误我不知道它们是什么意思。

这是我的 db/index.js 以防万一:

const mongoose = require('mongoose');
const config = require('../config/index');

mongoose.Promise = global.Promise;
mongoose
  .connect(config.MongoURL, 
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  )
  .then((data) => 
    console.log(data);
  )
  .catch((err) => 
    console.error(err);
  );

const db = mongoose.connection;
db.on('error', (err) => 
  console.log(`There was an error connecting to the database: $err`);
);
db.once('open', () => 
  console.log('connected');
);

module.exports = db;

【问题讨论】:

所有显示的代码都是服务器端代码,但是您将此问题标记为 React Native 并且显示的错误(不变违规:模块 AppRegistry)属于该域...您能否详细说明如何这个应用程序究竟是如何构建并启动的? @raina77ow 是的,因为我一运行npm start ios就会得到这些错误;该应用程序甚至无法正确构建。我只是不确定这是前端问题还是服务器端问题,因此标签和标题令人困惑。 'Invariant Violation' 错误是什么意思,也许我可以显示或解释相关代码 我认为这里发生的事情是 RN 也尝试加载 db/index 模块(由于依赖关系或其他原因),但未能正确加载。实际上,所有其余代码都与该问题没有太大关系,因此请考虑将其删除。可能有用的是依赖关系树 - 即,当代码启动时会消耗该文件的内容。 我也认为这 - ***.com/questions/48053837/… - 部分相关。 @raina77ow 在阅读了我的前端登陆屏幕的导入后,我发现了一个我不记得使用过的可疑导入语句。我相信import states from '../../server/db'; 也在尝试加载该 index.js 文件,但在这样做时遇到了问题(就像你说的那样)。非常感谢,应用程序现在构建。 【参考方案1】:

这在处理通用代码时很常见:有些部分可能无法在浏览器中运行,有些可能在 Node.js 中运行。有时这很好,因为它简化了关注点的分离,有时则不然,因为您实际上希望在这些域之间共享一些关注点。但有时——这是最坏的情况——它在不应该的时候被分享。

这个特殊案例之所以有趣,是因为有两件事。

首先,正如您所提到的,您的构建尝试从 db 导入客户端代码的一些依赖项。这是不行的,因为一般来说,服务器端数据库不应该直接在客户端上使用。是的,db/index.js 不仅定义了要导出的函数和类型,而且实际上还有一些“可执行”语句。比较一下:

export default function someFunction() 
  // this is not invoked on import - only when `someFunction` is called!
  require('mongoose').connect('...');

...使用您现在拥有的代码。

其次,如链接问题中所述,require('mongoose') 不会失败,因为它实际上可以在双方使用。不过,下一个 executable 语句确实失败了,因为“client”mongoose 上没有 connect 方法。

【讨论】:

【参考方案2】:

对于那些仍然对实际导致错误的原因感到困惑的人,我的一个客户端屏幕的开头是 import states from '../../server/db';。删除后,应用构建成功。

请参阅已接受的答案以更好地理解为什么会导致错误。

【讨论】:

以上是关于mongoose.connect 不是一个函数 - React Native的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:Post.create不是mongodb的函数

`mongoose.connect()` 引发错误:第一个参数应该是字符串,已接收

javascript [mongoose connect]功能连接到mongoose #mongoose

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

Mongoose.connect 不工作