mongodb Node.js 无法 识别 . env 中 的 任何 变量

ohfgkhjo  于 2022-11-22  发布在  Go
关注(0)|答案(3)|浏览(176)

我正在学习fullstackopen.com课程,我的.env文件似乎有问题,当前当我尝试连接到数据库时,我收到以下错误:

error connecting to MongoDB The `uri` parameter to `openUri()` 
must be a string, got "undefined". Make sure the first parameter to 
`mongoose.connect()` or `mongoose.createConnection()` is a string.

通过检查之前的答案,我发现Node.js没有正确读取进程的.env变量。大多数问题都是关于没有正确导入dotenv。我的代码有这个问题,所以我不认为这可能是问题所在。我还将.env变量打印到控制台,它是未定义的。我的.env文件也在项目的根目录中,所以我也不认为这是问题所在。
我已经包含了我的.env文件和用于调用下面代码的文件。
.env文件

MONGODB_URI='mongodb+srv://fullstackopen:<MyPasswordisHERE>@cluster0.brwcy.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'
PORT=3001

note.js应用程序

require('dotenv').config()
const mongoose = require('mongoose')
const url = process.env.MONGODB_URI
console.log('connecting to', url)

mongoose.connect(url)
    .then(result => {
        console.log('connected to MongoDB')
    })
    .catch((error) => {
        console.log('error connecting to MongoDB', error.message)
    })

const noteSchema = new mongoose.Schema({
    content: String,
    date: Date,
    important: Boolean,
})

noteSchema.set('toJSON', {
    transform: (document, returnedObject) => {
        returnedObject.id = returnedObject._id.toString()
        delete returnedObject._id
        delete returnedObject.__v
    }
  })
  
module.exports = mongoose.model('Note', noteSchema)

index.js

require('dotenv').config()
const { request, application, response } = require('express')
const express = require('express')
const app = express()
const Note = require('./models/note')
app.use(express.json())
app.use(express.static('build'))

const cors = require('cors')
app.use(cors())

  app.get('/', (request, response) => {
    response.send('<h1>Hello World</h1>')
  })

  app.get('/api/notes/:id', (request, response) => {
      const id = Number(request.params.id)
      const note = notes.find(note => note.id === id)
      if(note){
        response.json(note)
      }
      else {
        response.status(404).end()
      }
    })

  app.get('/api/notes',(request, response) => {
      Note.find({}).then(notes => {
        console.log(response)
        response.json(notes)
      })
  })

  app.delete('/api/notes/:id', (request, response) => {
    const id = Number(request.params.id)
    notes = notes.filter( note => note.id !== id)

    response.status(204).end()
  })

  const generateId = () => {
    const maxId = notes.length > 0 
    ? Math.max(...notes.map(n => n.id))
    : 0

    return maxId + 1
  }

  app.post('/api/notes', (request, response) => {
   
    const body = request.body

    if(!body.content){
      return response.status(400).json({
        error: 'content missing'
      })
    }

    const note = {
      content: body.content,
      important: body.important || false,
      date: new Date(),
      id: generateId(),
    }
    
    notes = notes.concat(note)
    response.json(note)

  })

  const unknownEndpoint = (request, response) => {
    response.status(404).send({error: 'unknown endpoint'})
  }

  app.use(unknownEndpoint)

  const PORT = process.env.PORT
  app.listen(PORT, ()=> {
      console.log(`Sever is running on port ${PORT}`)
  })

我知道我在note.js和index.js中导入了dotenv,原因是当我测试为什么无法识别.env时,我仅使用以下命令运行该文件检查了note.js文件,但在生产中,导入仅在index.js中,因此这不是问题所在

node note.js

我的项目文件结构也包括在下面

.  ..  build  .env  .git  .gitignore  index.js  models  mongo.js  node_modules  package.json  package-lock.json  Procfile  requests
htzpubme

htzpubme1#

确保您的.env位于文件夹结构中。例如,如果您的.env位于根文件夹中,但您尝试从文件夹中加载它,请确保添加正确的路径:

require('dotenv').config({path: __dirname + '/.env' })
5gfr0r5j

5gfr0r5j2#

解决了这个问题,当使用heroku部署时,必须配置配置变量以匹配.env中的环境变量
StackOverflow中的其他答案并不清楚如何做到这一点,我在下面概述了我采取的步骤。
1.转到应用程序〉设置〉显示配置变量
1.您将看到两个文本字段,一个标记为key,另一个标记为value
1.对于键,使其等于环境变量的名称,对我来说是MONGODB_URI
1.对于值字段,它应该等于您需要的环境变量,对我来说,它是MongoDB Atlas的url。

stszievb

stszievb3#

如@ConfusedDev所示
将此行添加到app.js

require('dotenv').config({path: __dirname + '/.env' })

相关问题