简体   繁体   English

NodeJS :: TypeError:无法读取未定义的属性“first_name”

[英]NodeJS :: TypeError: Cannot read property 'first_name' of undefined

I was learning the MEAN stack from a tutorial.我正在从教程中学习 MEAN 堆栈。 When I tried on my localhost, I got an error.当我在本地主机上尝试时,出现错误。

TypeError: Cannot read property 'first_name' of undefined类型错误:无法读取未定义的属性“first_name”

at router.post (/var/www/html/mean/contactlist/routes/route.js:17:28)在 router.post (/var/www/html/mean/contactlist/routes/route.js:17:28)

I found some similar questions on the internet.我在网上找到了一些类似的问题。 But I didn't find the correct solution.但我没有找到正确的解决方案。

Here is my app.js file这是我的app.js文件

//importing modules
var express =  require('express');
var mongoose = require('mongoose');
var bodyparser = require('body-parser');
var cors = require('cors');
var path = require('path'); //core module 


// calling express method
var app = express(); 


//connect to mongodb
mongoose.connect('mongodb://localhost/27017/contactlist');

//on connection
mongoose.connection.on('connected', () => {
    console.log("connected to database database mongodb @ 27017 ");
});

mongoose.connection.on('error', (err) => {

    if(err){
        console.log('Error in Database connection : ' + err);
    }
});

//adding middleware cors
app.use(cors());

//adding body parser
app.use(bodyparser.json());

//adding static files
app.use(express.static(path.join(__dirname, 'public')));

//setting port no 
const port = 3000;


//routing
var route = require('./routes/route'); 

//using the route
app.use('/api', route); 


//testing server
app.get('/', (req, res)=>{

    res.send('foobar');

});

//binding the server with port no (callback)

app.listen(port,() =>{
    console.log('Server Started at Port : '+ port);


});

From a stackOverflow solution, I found,从 stackOverflow 解决方案中,我发现,

I should use the following line before routing我应该在路由之前使用以下行

app.use(bodyparser.json());

So I changed it.所以我改变了它。

And my ./routes/route.js还有我的./routes/route.js

const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

//Retrieving contacts
router.get('/contacts', (res, req, next) => {
    contact.find(function(err,contacts){
        res.json(contacts);
    })

});

//Add contact
router.post('/contact', (res, req, next) => {
    let newContact = new Contact({
        first_name:req.body.first_name,
        last_name:req.body.last_name,
        phone:req.body.phone
    });

    

    newContact.save((err,contact) => {

        if(err){
            res.json({msg : 'Failed to add contact'});
        }
        else{
           res.json({msg : 'Contact added successfully'}); 
        }

    });
});


//Deleting Contact
router.delete('/contact/:id', (res, req, next) => {
    contact.remove({_id: req.params.id }, function(err, result){

        if(err){
            res.json(err);
        }
        else{
            res.json(result);
        }

    });
});


module.exports = router;

Dependencies from package.json来自package.json 的依赖

"dependencies": {
    "body-parser": "^1.17.1",
    "cors": "^2.8.3",
    "express": "^4.15.2",
    "mongoose": "^4.9.8"
  }

And the version of the nodejs is而nodejs的版本是

v7.10.0

I used Postman to test the API我使用 Postman 来测试 API

So I tested with POST method and following content-type option.所以我使用 POST 方法和以下内容类型选项进行了测试。

 {"Content-Type":"application/x-www-form-urlencoded"}

This was my sample input这是我的示例输入

{ 
   "first_name" : "RENJITH",
   "last_name"  : "VR",
   "phone" :  "1234567890"
}

Is it a version issue?是版本问题吗? Please suggest me the correct way of coding.请建议我正确的编码方式。

Your content type is {"Content-Type":"application/x-www-form-urlencoded"} In order to support URL-encoded bodies of data you need to use this:您的内容类型是{"Content-Type":"application/x-www-form-urlencoded"}为了支持 URL 编码的数据主体,您需要使用:

app.use(bodyparser.urlencoded({     // to support URL-encoded bodies
  extended: true
}));

What you used is for JSON-encoded data, such as POST: {"name":"foo","color":"red"}你使用的是 JSON 编码的数据,比如POST: {"name":"foo","color":"red"}

EDIT:编辑:

The order of your route parameters are wrong.您的路由参数的顺序是错误的。 It's not router.post('/contact', (res, req, next)这不是router.post('/contact', (res, req, next)

It's actually router.post('/contact', (req, res, next)它实际上是router.post('/contact', (req, res, next)

The first parameter is the request, the second is the response.第一个参数是请求,第二个参数是响应。

Just Move lines body-parse at the top before route (app.js)只需在路由前移动顶部的 body-parse 行(app.js)

app.use(bodyparser.json());

app.use('/api',route);

I was facing same issue but this is how it's been solved for me我遇到了同样的问题,但这就是为我解决的方法

At the top of the file before any routes and after require statements use在任何路由之前和require语句之后的文件顶部使用

app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())

then in the post request route use res.json()然后在 post 请求路由中使用res.json()

here is sample code:这是示例代码:

var express = require('express');
var bodyParser = require('body-parser')
var app = express();

app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  res.sendFile(__dirname + './index.html')
})

app.post("/name", (req, res) => {
    let fullName = req.body.first + ' ' + req.body.last;
    res.json({ name: fullName }) 
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 渲染错误:“TypeError:无法读取未定义的属性‘first_name’” - Error in render: "TypeError: Cannot read property 'first_name' of undefined" 节点JS | TypeError:无法读取未定义的属性“ first_name” - Node JS | TypeError: Cannot read property 'first_name' of undefined 错误类型错误:无法读取未定义的属性“first_name” - ERROR TypeError: Cannot read property 'first_name' of undefined 无法读取未定义的属性“first_name” - Cannot read property 'first_name' of undefined TypeError:无法读取ES6模型上未定义的属性“ first_name” - TypeError: Cannot read property 'first_name' of undefined on es6 model 云函数错误:函数返回未定义、预期的承诺或值,以及类型错误:无法读取未定义的属性“First_Name” - Cloud Functions Error: Function returned undefined, expected Promise or value, as well as TypeError: Cannot read property 'First_Name' of undefined 类型错误:无法读取未定义 NodeJS 的属性“名称” - TypeError: Cannot read property 'name' of undefined NodeJS TypeError:无法读取 Nodejs 中未定义的属性“名称” - TypeError: Cannot read property 'name' of undefined in Nodejs [Vue 警告]:渲染函数中的错误:“TypeError:无法读取 null 的属性 'first_name'” - [Vue warn]: Error in render function: “TypeError: Cannot read property 'first_name' of null” TypeError:无法读取nodejs中未定义的属性“ push” - TypeError: Cannot read property 'push' of undefined in nodejs
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM