繁体   English   中英

MongoDB 和 NodeJS 无法创建集合

[英]MongoDB and NodeJS cannot create collection

所以我在大约 8 个月前使用了这个确切的代码,它工作得很好,现在突然这种设置方式似乎不起作用。 我无法在这里找到问题所在,而且似乎数据库根本没有连接。 有没有更好的方法来解决这个问题?

 'use strict' const express = require('express'); const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://toor:root@mongodbdatabase:27017/' const app = express(); const PORT = 8080; const HOST = '0.0.0.0'; let con; MongoClient.connect(url, (err, db) => { con = db.db("mongodbdatabase"); }) app.use('/', express.static('public')); app.get('/createDatabase', (req, res) => { con.createCollection("HiveDB", function(err, result) { if (err) throw err; console.log("Collection Created") }) res.send(); }) console.log(`Listening on port ${PORT}`) app.listen(PORT, HOST);

这是我在导航到 localhost:83/createDatabase 时遇到的错误

TypeError: Cannot read properties of undefined (reading 'createCollection')
    at /usr/src/app/server.js:28:9
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at next (/usr/src/app/node_modules/express/lib/router/route.js:144:13)
    at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:114:3)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:15
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:346:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:280:10)
    at SendStream.error (/usr/src/app/node_modules/serve-static/index.js:121:7)
    at SendStream.emit (node:events:537:28)

我也在使用 docker compose 运行

Dockerfile:

FROM node:latest

EXPOSE 8080

WORKDIR /usr/src/app

RUN npm install express --save
RUN npm install mongodb --save
RUN npm install -g loadtest --save

COPY server.js /usr/src/app/server.js
COPY /public /usr/src/app/public


CMD ["node", "server.js"]

码头工人-compose.yml:

version: '3'
services:

  mainserver:
    build: ./main
    depends_on:
      - mongodbdatabase
    container_name: mainServer
    ports:
      - "83:8080"


  mongodbdatabase:
    image: mongo
    container_name: monDataBase
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: toor
      MONGO_INITDB_ROOT_PASSWORD: root

我将引导您从 mongodb 客户端 github 自述文件中查看相关文档

在您粘贴的代码片段中,您使用MongoClient连接设置con变量,但是如果连接失败(并且提供了err )怎么办? 所以分配给con可能失败了,这就是它在路由器上下文中undefined的原因。

我建议从我提供的链接中复制并粘贴示例。

使用 async/await 语法,您可以将 mongodb 客户端提供给路由处理程序。

这是使用您的示例的代码片段:

'use strict'

const express = require('express');
const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://toor:root@mongodbdatabase:27017/'

const app = express();
const PORT = 8080;
const HOST = '0.0.0.0';

async function init() {
   try{
     const client = await new MongoClient(url).connect()
   }catch(err) {
     console.error(err.message)
   }
   const db = client.db("HiveDB")
   app.use('/', express.static('public'));

   app.get('/createDatabase', (req, res) => {
     db.createCollection("HiveDB", function(err, result) {
          if (err) throw err;
          console.log("Collection Created")
     })
     res.send();
   })

   

   app.listen(PORT, HOST,()=>{
   console.log(`Listening on port ${PORT}`)
   });
}
init()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM