node.js - MERN - TypeError:无法读取未定义的属性“id”
问题描述
我做了很多研究并尝试了不同的东西,但我似乎可以解决某些 POST 请求。
添加练习作品的 GET 请求和 POST 请求,但删除或更新练习的 POST 请求。
我的假设是,某些响应不会被exercises.js 文件中的express 识别,因为每当调用update 或delete 路由中的Exercise.findById(res.params.id)时它都会失败。
任何帮助都感激不尽。
服务器.js
const express = require('express') // Express web framework
const cors = require('cors') // Cross-origin resource sharing (CORS) -> Connects Express
const mongoose = require('mongoose') // Mongoose will connect us to the mongoDB database
const exercisesRouter = require('./routes/exercises')
const usersRouter = require('./routes/users')
require('dotenv').config() // configure environment variables in .env file
// to create the Express server
const app = express()
const port = process.env.PORT || 5000 // 5000 Port
// Middleware
app.use(cors()) // CORS middleware
app.use(express.json()) // Express middleware to allow us to parse JSON
// MongoDB Connection process
const uri = process.env.ATLAS_URI // MongoDB database URI connection string form mongoDB Atlas -- ATLAS_URI will be stored in .env file
mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true }) // start connection to db
const connection = mongoose.connection
connection.once('open', () => {
console.log("MongoDB database connection established successfully")
})
// Routing to respective pages
app.use('/exercises', exercisesRouter) // routes to /exercises page
app.use('/users', usersRouter)// routes to /users page
// Start the server
app.listen(port, () => {
console.log(`Server is running on port: ${port}`)
})
练习.model.js
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const exerciseSchema = new Schema({
username: { type: String, required: true },
description: { type: String, required: true},
duration: { type: Number, required: true},
date: { type: Date, required: true}
}, {
timestamps: true,
})
const Exercise = mongoose.model('Exercise', exerciseSchema)
module.exports = Exercise
练习.js
const router = require('express').Router() // Creating route for Exercises
let Exercise = require('../models/exercises.model') // Mongoose model
// Handles incoming HTTP GET requests for /exercises URL
router.route('/').get((req, res) => {
Exercise.find()
.then(exercises => res.json(exercises))
.catch(err => res.status(400).json('Error: ' + err))
})
/*** Handles incoming HTTP POST requests ***/
// Create new exercise
router.route('/add').post((req, res) => {
const username = req.body.username
const description = req.body.description
const duration = Number(req.body.duration)
const date = Date.parse(req.body.date)
const newExercise = new Exercise({
username,
description,
duration,
date
})
newExercise.save()
.then(() => res.json('Exercise added !'))
.catch(err => res.status(400).json('Error = ' + err))
})
// Get exercise by ID
router.route('/:id').get((req, res) => {
Exercise.findById(req.params.id)
.then(exercises => res.json(exercises))
.catch(err => res.status(400).json('Error: ' + err))
})
// Delete exercise
router.route('/:id').delete((res, req) => {
Exercise.findByIdAndDelete(req.params.id)
.then(() => res.json('Exercise deleted'))
.catch(err => res.status(400).json('Error: ' + err))
})
// Update exercise
router.route('/update/:id').post((res, req) => {
Exercise.findById(req.params.id)
.then(exercises => {
exercises.username = req.body.username
exercises.description = req.body.description
exercises.duration = Number(req.body.duration)
exercises.date = Date.parse(req.body.date)
exercises.save()
.then(() => res.json('Exercise updated!'))
.catch(err => res.status(400).json('Error: ' + err))
})
.catch(err => res.status(400).json('Error: ' + err))
})
module.exports = router
nodemon 服务器输出
[nodemon] starting `node server.js`
Server is running on port: 5000
MongoDB database connection established successfully
TypeError: Cannot read property 'id' of undefined
at C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\routes\exercises.js:48:34
at Layer.handle [as handle_request] (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:281:22
at param (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:354:14)
at param (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:365:14)
at Function.process_params (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:410:3)
at next (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:275:10)
at Function.handle (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:174:3)
at router (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:47:12)
at Layer.handle [as handle_request] (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:317:13)
at C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:284:7
at Function.process_params (C:\Users\sambaetleuk\Projects\mern-fitness-tracker\backend\node_modules\express\lib\router\index.js:335:12)
解决方案
我能想到的一个解决方案是 this -> (req, res) 在你的回调函数中,因为它通常在这个序列中。
推荐阅读
- php - 试图保存评论,但应用程序将我重定向到一个空页面
- javascript - 制作下一个按钮选择 dom 列表中的下一项
- ruby - Ruby Socket - 计算出还有多少字节要读取(SSLSocket)
- sql - 无论字段计数是否为 0,是否可以基于更新查询?(MS 访问,SQL)
- datatable - DataTable 加载速度很慢
- javascript - 网络 A 帧示例切换视频不起作用
- asciidoc - 有没有办法在 Asciidoc 中不格式化文本块?
- javascript - 对象 Promise 而不是真正的 Value
- javascript - Javascript - 触发函数从另一个函数返回
- google-cloud-storage - 如何以最优化的方式将包含大量文件的 GCS 存储桶复制到另一个项目