【问题标题】:TypeError: Cannot read property 'email' of undefined in nodejsTypeError:无法读取nodejs中未定义的属性“电子邮件”
【发布时间】:2019-04-14 17:15:46
【问题描述】:

我正在尝试使用 nodejs 制作 api。在这里,我正在为 api 制作注册路线,但问题是每次我尝试注册用户时都会这样说。 这是我得到的全部错误。

TypeError: 无法读取未定义的属性“电子邮件”

TypeError: Cannot read property 'email' of undefined
    at C:/projects/blog-mern/backend/src/routes/users.js:7:13
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\route
.js:137:13)
    at Route.dispatch (C:\projects\blog-mern\backend\node_modules\express\lib\ro
uter\route.js:112:3)
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at C:\projects\blog-mern\backend\node_modules\express\lib\router\index.js:28
1:22
    at Function.process_params (C:\projects\blog-mern\backend\node_modules\expre
ss\lib\router\index.js:335:12)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\index
.js:275:10)
    at Function.handle (C:\projects\blog-mern\backend\node_modules\express\lib\r
outer\index.js:174:3)
    at router (C:\projects\blog-mern\backend\node_modules\express\lib\router\ind
ex.js:47:12)
    at Layer.handle [as handle_request] (C:\projects\blog-mern\backend\node_modu
les\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\projects\blog-mern\backend\node_modules\express\lib\route
r\index.js:317:13)
    at C:\projects\blog-mern\backend\node_modules\express\lib\router\index.js:28
4:7
    at Function.process_params (C:\projects\blog-mern\backend\node_modules\expre
ss\lib\router\index.js:335:12)
    at next (C:\projects\blog-mern\backend\node_modules\express\lib\router\index
.js:275:10)
    at C:\projects\blog-mern\backend\node_modules\body-parser\lib\read.js:130:5

这是我的代码

models/users.js

import mongoose from 'mongoose';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

const schema = new mongoose.Schema({
    email: {
        type: String,
        required: true
    },
    passwordHash: {
        type: String,
        required: true
    }
}, {
    timestamps: true
});

schema.methods.setPassword = function setPassword(password) {
    this.passwordHash = bcrypt.hashSync(password, 10)
}

schema.methods.generateJWT = function generateJWT() {
    return jwt.sign({
        email: this.email,
    }, 'secret')
}

schema.methods.toAuthJSON = function toAuthJSON() {
    return {
        email: this.email,
        token: this.generateJWT()
    }
}

export default mongoose.model('User', schema);

routes/users.js

import express from 'express';
import User from '../models/User';

const router = express.Router();

router.post('/', (req, res, next) => {
    const { email, password } = req.body.users;
    const user = new User({ email });
    user.setPassword(password);
    user.save().then(userRecord => {
        res.json({user: userRecord.toAuthJSON()})
    }).catch(err => {
        res.status(500).json({
            error: err
        })
    })
})

export default router;

我正在使用邮递员发送请求

【问题讨论】:

  • 哪行代码抛出错误?您是否调试过这些值?
  • 你挂载了body-parser吗?
  • req.body.users 未定义,您如何从客户端发送?你的req.body.users是什么@
  • 您可以将您的邮递员请求参数/详细信息添加到问题中吗? @naga-elixir-jar 是正确的。
  • 也是标题,是application/json

标签: javascript node.js mongoose mongoose-schema


【解决方案1】:

您的代码的问题是您试图从不存在的req.body 读取users 密钥。您的源请求对象不包含users

如果您console.log(req.body)req.body 将与您的请求完全一样:

{
  email: "adityakmr088@gmail.com"
  passwordHash: "12345"
}

将您的代码更改为:

const { email, passwordHash } = req.body;
const user = new User({ email });

【讨论】:

  • 现在这是Error: data and salt arguments required
  • @adityakumar 编辑您的问题以包含堆栈跟踪(您之前添加的)。不要删除它,这是问题的重要组成部分
猜你喜欢
  • 2021-07-21
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2023-03-11
相关资源
最近更新 更多