在 Google App Engine 上连接 Mongoose

2024-05-22

我已在 Google App Engine 上成功部署了自定义 Node.js 应用程序。但是,我在启动应用程序时遇到问题,因为猫鼬在尝试连接时超时。令人沮丧的是,猫鼬在我的本地计算机上以完全相同的参数连接得很好。

我的 MongoDb URI 的形式为:

 mongodb://<dbuser>:<dbpassword>@xxxx.mlab.com:<portNumber>/d‌​b-name

正如 URI 所暗示的,数据库由 mlab 托管。它是 Google Cloud Platform 上的沙箱实例。然而,我没有使用 Google Compute Engine 部署数据库。在 mlab 上进行设置过程时,我只是选择托管在 GCP 上。

我在 SO 上遇到过类似的问题,但大多数都没有公认的答案。只是评论中的说法不同,没有公认的解决方案。

因此,我的问题是,当尝试连接到上述 URI 时,我的 App Engine 实例和本地计算机有什么不同?我选择 mlab 在 GCP 上托管它这一事实重要吗?如果我选择将其托管在 Amazon AWS 上,会有什么不同吗?问题的根本原因到底是什么?

作为参考,以下是我发现的类似问题:

  • 我可以从本地主机连接到谷歌云部署的 mongoDB,但在应用程序引擎上部署时不能从同一个应用程序连接到 https://stackoverflow.com/questions/45601970/i-can-connect-to-a-google-cloud-deployed-mongodb-from-localhost-but-not-from-the

  • 在谷歌计算引擎上使用 mongoose 连接到 mongodb 时出错 https://stackoverflow.com/questions/32865127/error-connecting-to-mongodb-with-mongoose-on-google-compute-engine

  • 应用程序部署在谷歌应用程序引擎上后无法连接到 mongodb https://stackoverflow.com/questions/42187507/cannot-connect-to-mongodb-after-app-deploys-on-google-app-engine

此外,如果有帮助的话,mongodb 还可用作业务模型的数据库、应用程序 Express Session 的数据存储以及存储来自 socket.io 的瞬态数据。

部署后来自 App Engine 的错误堆栈跟踪:

2017-10-18 02:13:46 default[20171017t215757]  npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
2017-10-18 02:13:46 default[20171017t215757]  npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
2017-10-18 02:13:46 default[20171017t215757]  npm ERR! enoent This is most likely not a problem with npm itself
2017-10-18 02:13:46 default[20171017t215757]  npm ERR! enoent and is related to npm not being able to find a file.
2017-10-18 02:13:46 default[20171017t215757]  npm ERR! enoent
2017-10-18 02:13:46 default[20171017t215757]
2017-10-18 02:13:46 default[20171017t215757]  npm ERR! Please include the following file with any support request:
2017-10-18 02:13:46 default[20171017t215757]  npm ERR!     /app/npm-debug.log
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! Linux 3.16.0-4-amd64
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! argv "/nodejs/bin/node" "/nodejs/bin/npm" "start"
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! node v6.11.3
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! npm  v3.10.10
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! path /app/package.json
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! code ENOENT
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! errno -2
2017-10-18 02:23:41 default[20171017t215757]  npm ERR! syscall open

在 Google Cloud Shell 中本地运行应用程序时出现错误堆栈跟踪:

/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb/lib/mongo_client.js:421
          throw err
          ^
MongoError: failed to connect to server [ds147454.mlab.com:47454] on first connect [MongoError: connection 1 to ds147454.mlab.com:47454 timed out]
    at Pool.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/topologies/server.js:336:35)
    at emitOne (events.js:96:13)
    at Pool.emit (events.js:188:7)
    at Connection.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/connection/pool.js:280:12)
    at Connection.g (events.js:292:16)
    at emitTwo (events.js:106:13)
    at Connection.emit (events.js:191:7)
    at Socket.<anonymous> (/home/myuser/src/project-id/teammate-express-server/node_modules/mongodb-core/lib/connection/connection.js:197:10)
    at Socket.g (events.js:292:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:338:8)
    at ontimeout (timers.js:386:14)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)

正如所指出的,您可以按照以下说明进行操作https://cloud.google.com/nodejs/getting-started/deploy-mongodb https://cloud.google.com/nodejs/getting-started/deploy-mongodb使用以下命令配置 Google App Engineconfig.json file. (update: 链接不再有效,请尝试:https://cloud.google.com/community/tutorials/nodejs-mongodb-on-appengine https://cloud.google.com/community/tutorials/nodejs-mongodb-on-appengine反而)

既然你正在使用mongoose模型将决定集合的用途。即保存(),更新()。 如果您使用以下方式连接node.js直接,您还可以在代码中轻松更改数据库/集合。

当尝试连接到上述 URI 时,我的 App Engine 实例和本地计算机有什么不同?

谷歌应用引擎 https://cloud.google.com/appengine/是一个完全托管的平台。从某种意义上来说是无服务器 https://cloud.google.com/serverless/,您正在利用一组工作人员来扩大/缩小您的应用程序的规模。当请求进入您的应用程序时,池中的实例将处理该任务/请求。

与您的本地计算机不同,本地计算机的请求也将由您的计算机处理。

您可能还会发现Google 应用引擎常见问题解答 https://cloud.google.com/appengine/kb/有用。

我选择 mlab 在 GCP 上托管它这一事实重要吗?

不是很多。正如您所提到的,您目前使用的是 GCP 的 SandBox(免费)计划。目前,这会将您的 MongoDB 实例部署在us-central1地区,没有其他地区选择。不同云提供商之间的 RAM/存储/价格也略有不同。

您可以通过选择 GAE 来减少网络延迟us-central1地区也是如此。

问题的根本原因到底是什么?

如果没有正确的堆栈跟踪或描述超时问题的错误日志,则很难确定问题是什么。

常见node.js项目包含一个名为的 JavaScript 文件config.js下面有一行:

  nconf.argv()
       .env()
       .file({ file: path.join(__dirname, 'config.json') })
       .defaults()

基本上尝试按以下顺序读取配置:

  • 命令行参数
  • 环境变量
  • 配置文件(指定路径)
  • 默认值

也可以看看Google 云平台:nodejs 入门 https://github.com/GoogleCloudPlatform/nodejs-getting-started

Also GoogleCloudPlatform/nodejs-docs-samples/appengine/mongodb https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/appengine/mongodb项目为例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Google App Engine 上连接 Mongoose 的相关文章

随机推荐

  • 使用 System.IO.compressing.Gzip 压缩和解压缩非常大的文件

    我的问题可以用以下语句来描述 我希望我的程序能够压缩和解压缩选定的文件 我有非常大的文件 20 GB 可以安全地假设该大小永远无法装入内存 即使压缩后 压缩文件可能仍然无法放入内存 我想使用 System IO Compression Gz
  • Android Wear:在手持设备上启动服务

    我正在构建一个 Wear 应用程序 它将与手持设备上的 WearableListenerService 进行通信 但是 我想确保当应用程序在手表上启动时服务已启动并运行 我最初的想法是发送意图或广播消息来启动服务 但是 我一直无法弄清楚如何
  • 将 url 从 utf-8 编码重新编码为 iso-8859-1 编码

    我有 file 链接 其中包含非英语字符 这些字符以 UTF 8 进行 UrlEncoded 为了使这些链接在浏览器中工作 我必须对它们重新编码 file development H C3 A5ndplukket doc becomes f
  • 黄瓜测试java例子?

    我想尝试使用黄瓜测试的示例应用程序 黄瓜测试可以仅使用 ruby 完成 也可以使用 java 完成 请帮我举一个示例 谢谢 您可以查看我们在我们这里编写的一个简单示例来演示 cucumber jvm https github com gph
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这
  • 蜘蛛猴和垃圾收集

    我正在将 Spidermonkey 嵌入到我的 C 应用程序中 我需要在本机 C 中实现一些传递 jsval 的自定义 Javascript 函数 我需要防止 jsval 被意外垃圾收集 我这样做是否合适 1 在初始化例程中 static
  • 如何将 glob 表达式分配给 Bash 脚本中的变量?

    当在 bash 脚本中执行以下两行代码时 ls 会抱怨文件不存在 dirs content dev01 dev02 ls l dirs 当我使用 x 选项运行脚本时 它似乎在单引号内传递变量 这将防止通配 dirs content dev0
  • 管理一堆具有依赖关系的 NSOperation

    我正在开发一个创建内容并将其发送到现有后端的应用程序 内容是标题 图片和位置 没有什么花哨 后端有点复杂 所以这是我必须做的 让用户拍照 输入标题并授权地图使用其位置 为帖子生成唯一标识符 在后台创建帖子 上传图片 刷新用户界面 我使用了几
  • 在 PHP 中从 URL 斜杠后获取两个单词

    我需要从 URL 中获取两个单词 例如我有以下 URL http mydomain com alrajhi invoice 108678645541 http mydomain com alrajhi invoice 10867864554
  • 如何在 React js 上使用历史记录重定向到另一个页面?

    我在前端使用 Reactjs 并在后端使用 Laravel 开发了一个注册页面 我希望当我单击注册按钮时 它将被重定向到我的登录页面 我的注册组件是 handleSubmit event gt event preventDefault co
  • AWS S3 预签名 URL 的 IAM 角色

    我正在 EC2 实例中部署一个服务器程序 该实例需要能够为 s3 创建预签名 URL 到目前为止 我已将 AWS 凭证放在环境变量中进行测试 但我现在想切换到 IAM 角色策略 但是 我不确定该角色也应该有权访问哪些策略 我最初的猜测是拥有
  • 流口水中的无状态与有状态会话行为

    我是新来的流口水 我试图了解 Drools 提供的无状态会话和有状态会话之间的区别 据我初步了解 在无状态会话的情况下 如果在任何规则的操作执行期间修改了事实 则不会重新提交给推理引擎来查找与修改的事实相匹配的新规则 在有状态会话的情况下
  • 用教义 2 DBAL 连接子查询

    我正在重构 Zend 框架2应用程序使用学说 2 5 DBAL 而不是 Zend DB ZF1 我有以下 Zend Db 查询 subSelect db gt select gt from user survey status entrie
  • 如何在 Angular 中的 chrome 浏览器中捕获控制台日志

    这是我为日志 错误 警告和调试编写的代码片段 如何查看浏览器中存储的值 let defaultLog console log bind console let defaultError console error bind console
  • C++ 模板似乎破坏了访问说明符

    由于明显的原因 以下代码无法编译 即 Foo 正在尝试访问 Bar 的私有成员 但是 如果您取消注释 注释标记的行 使 Foo 成为模板 它会编译并输出 42 我在这里缺少什么 为什么这有效 在我看来不应该 感谢您的帮助 include
  • 如何以编程方式向 DRF 3 中的 PrimaryKeyRelatedField 提供“queryset”

    为了有一个非只读PrimaryKeyRelatedField 您需要提供包含有效选项的查询集 如何根据当前请求 用户 正确填充该查询集 关键是子类化PrimaryKeyRelatedField并超载get queryset方法 使用请求上下
  • R 中的卡方拟合优度检验

    我有一个观察值向量 还有一个用模型计算的值向量 actual lt c 1411 439 214 100 62 38 29 64 expected lt c 1425 3 399 5 201 6 116 9 72 2 46 3 30 4 6
  • 连接两个表而不返回不需要的行

    我的表结构如下所示 tbl users tbl issues userid real name issueid assignedid creatorid 1 test 1 1 1 1 2 test 2 2 1
  • C++ GUI 桌面 Windows 应用程序的测试自动化工具/库/框架

    不幸的是 我有一个在 Windows 上运行的 GUI 桌面应用程序 并使用 Borland C 编译器进行编译 我知道这是一项非常古老的技术 但这就是生活 我工作的公司有很多免费的 QTP 许可证 但说实话 我不喜欢这个工具 我想用一些开
  • 在 Google App Engine 上连接 Mongoose

    我已在 Google App Engine 上成功部署了自定义 Node js 应用程序 但是 我在启动应用程序时遇到问题 因为猫鼬在尝试连接时超时 令人沮丧的是 猫鼬在我的本地计算机上以完全相同的参数连接得很好 我的 MongoDb UR