NodeJS :: TypeError: невозможно прочитать свойство first_name неопределенного

Я изучал стек MEAN из учебника. Когда я попробовал на своем локальном хосте, я получил ошибку.

TypeError: Не удается прочитать свойство first_name неопределенного

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

Я нашел несколько подобных вопросов в Интернете. Но правильного решения не нашел.

Вот мой файл 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);


});

Из решения stackOverflow я обнаружил,

Я должен использовать следующую строку перед routing

app.use(bodyparser.json());

Поэтому я изменил его.

И мой ./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;

Зависимости от package.json

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

И версия nodejs

v7.10.0

Я использовал Postman для тестирования API

Поэтому я протестировал метод POST и следующую опцию типа контента.

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

Это был мой пример ввода

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

Это проблема версии? Подскажите, пожалуйста, правильный способ кодирования.


person Renjith V R    schedule 12.05.2017    source источник
comment
Где можно получить эту ошибку? В этой ошибке вы всегда получаете файл и строку.   -  person Nedim Hozić    schedule 12.05.2017
comment
@NedimHozić - first_name:req.body.first_name   -  person Renjith V R    schedule 12.05.2017


Ответы (3)


Ваш тип контента — {"Content-Type":"application/x-www-form-urlencoded"}. Чтобы поддерживать массивы данных в URL-кодировании, вам необходимо использовать это:

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

То, что вы использовали, предназначено для данных в кодировке JSON, таких как POST: {"name":"foo","color":"red"}

РЕДАКТИРОВАТЬ:

Порядок параметров вашего маршрута неверен. Это не router.post('/contact', (res, req, next)

На самом деле это router.post('/contact', (req, res, next)

Первый параметр — запрос, второй — ответ.

person bamtheboozle    schedule 12.05.2017
comment
Спасибо за ваше решение. Я думаю, что это было bodyparser. Не bodyParser . Верно? И я попытался. Это не работает! - person Renjith V R; 12.05.2017
comment
Вы определили свой переменный bodyparser, поэтому вы должны использовать его. Я отредактировал свой пост, чтобы отразить это. Добавьте код, который я упомянул, но с bodyparser вместо bodyParser, и попробуйте отправить запрос еще раз. (убедитесь, что вы перезапустили сервер). Он должен работать. - person bamtheboozle; 12.05.2017
comment
Если вы установите для заголовка Content-Type значение application/json в Postman, он должен работать даже без необходимости добавления промежуточного программного обеспечения с urlencoded. - person bamtheboozle; 12.05.2017
comment
Я использую нодмон. Так что мне не нужно перезапускать сервер. Верно? - person Renjith V R; 12.05.2017
comment
О, параметры вашей функции в неправильном порядке. Поменяйте порядок res и req и все должно работать. - person bamtheboozle; 12.05.2017
comment
Спасибо за помощь мне. - person Renjith V R; 12.05.2017

Просто переместите строки для анализа тела вверху перед маршрутом (app.js)

app.use(bodyparser.json());

app.use('/api',route);
person Brahmmeswara Rao Palepu    schedule 24.09.2018

Я столкнулся с той же проблемой, но вот как она была решена для меня

В верхней части файла перед любыми маршрутами и после использования операторов require

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

затем в маршруте почтового запроса используйте res.json()

вот пример кода:

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 }) 
});
person jdk    schedule 01.12.2020