ti-enxame.com

Leitura AJAX postar variáveis ​​no Node.JS (com Express)

Estou tentando obter os valores que estou enviando para uma postagem ajax no meu aplicativo de nó. Usando este post como guia, eu tenho isso até agora:

No nó:

 var express = require('express');
 var app = express();

 var db = require('./db');

 app.get('/sender', function(req, res) {
    res.sendfile('public/send.html');
 });

 app.post('/send_save', function(req, res) {
  console.log(req.body.id)
  console.log(req.body.title);
  console.log(req.body.content);
  res.contentType('json');
  res.send({ some: JSON.stringify({response:'json'}) });
});

app.listen(3000);

No lado AJAX:

$('#submit').click(function() {
            alert('clicked')
            console.log($('#guid').val())
            console.log($('#page_title').val())
            console.log($('#page-content').val())
            $.ajax({
                url: "/send_save",
                type: "POST",
                dataType: "json",
                data: {
                    id: $('#guid').val(),
                    title: $('#page_title').val(),
                    content: $('#page-content').val()
                },
                contentType: "application/json",
                cache: false,
                timeout: 5000,
                complete: function() {
                  //called when complete
                  console.log('process complete');
                },

                success: function(data) {
                  console.log(data);
                  console.log('process sucess');
               },

                error: function() {
                  console.log('process error');
                },
              });
        })

Esse problema é que não consigo req.body.id (e qualquer outro valor como título ou conteúdo), estou recebendo esse erro no nó:

 TypeError: Cannot read property 'id' of undefined

Se eu comentar essas chamadas, o ajax será bem-sucedido. Eu estou perdido. Estou esquecendo alguma coisa?

11
streetlight

O objeto req que você possui não possui nenhuma propriedade body. Dê uma olhada em http://expressjs.com/api.html#req.body :

Esta propriedade é um objeto que contém o corpo da solicitação analisada. Esse recurso é fornecido pelo middleware bodyParser (), embora outro middleware de análise de corpo possa seguir essa convenção também. O padrão desta propriedade é {} quando bodyParser () é usado.

Portanto, você precisa adicionar o middleware bodyParser ao seu aplicativo expresso da web assim:

var app = express();
app.use(express.bodyParser());
9
thejh

O problema foi realmente resolvido incluindo o middleware bodyParser, conforme sugerido por thejh.

Não deixe de visitar o URL fornecido nessa resposta para visitar a especificação atualizada do Express: http://expressjs.com/api.html#req.body

A documentação fornece este exemplo (Express 4.x):

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

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.post('/', function (req, res) {
  console.log(req.body);
  res.json(req.body);
})

Para que isso funcione, o módulo analisador de corpo precisa ser instalado separadamente:

https://www.npmjs.com/package/body-parser

7
Lex L.