我正在關注 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 沒有正確讀取 process.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)
索引.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
uj5u.com熱心網友回復:
確保您的 .env 在檔案夾結構中。例如,如果您的 .env 位于根檔案夾中,但您嘗試從檔案夾中加載它,請確保添加正確的路徑:
require('dotenv').config({path: __dirname '/.env' })
uj5u.com熱心網友回復:
找出問題,在使用 heroku 部署時,您必須配置配置變數以匹配 .env 中的環境變數
StackOverflow 中的其他答案并不清楚如何執行此操作,我已在下面概述了我采取的步驟。
- 轉到應用程式 > 設定 > 顯示配置變數
- 您將看到兩個文本欄位,一個標記為鍵,另一個為值
- 對于關鍵使它等于我的環境變數的名稱是 MONGODB_URI
- 對于 value 欄位,它應該等于您需要的環境變數,對我來說,它是 MongoDB Atlas 的 url。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/393913.html
