簡體   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