Попытка анализа объекта JSON из запроса POST в Express v4 с использованием body-parser

1

В настоящее время я преподаю больше кода сервера, в частности, используя Node.js и Express, и у меня возникают большие проблемы с получением и анализом объекта JSON, отправленного из запроса POST. Я просмотрел множество других сообщений (связанных ниже), и я не могу понять, насколько я ошибаюсь. Вот на что я смотрел:

Javascript: Отправить объект JSON с помощью AJAX Javascript: отправить объект JSON с помощью Ajax? Как использовать данные JSON POST в приложении Express Как использовать данные JSON POST в приложении Express Отправить данные POST с помощью XMLHttpRequest Отправить данные POST с использованием XMLHttpRequest Как вы извлекаете данные POST в Node.js? Как вы извлекаете данные POST в Node.js?

Все это ставит меня на правильный путь, но я не совсем там и поэтому ищу помощь. Здесь код, с которым я работаю:

Отправить запрос POST

var button = document.querySelector("#button");

button.onclick = function(){
    console.log("Getting data from local server");

    var xhr = new XMLHttpRequest();

    xhr.open("POST", "http://localhost:3000/data/test.json", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send(JSON.stringify({"latitude": 41.2418, "longitude": -70.8898}));
};

Обработать запрос POST на сервере

var http = require("http");
var fs = require("fs");
var express = require("express");
var app = express();
var path = require("path");
var bodyParser = require("body-parser");

var port = process.env.PORT || 3000;
//tells express where to find all the static files (HTML, CSS, etc) and load them into the browser
app.use(express.static(path.join(__dirname, '../client')));

//tells the application to use body-parser as middleware so it can handle post requests
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

//routing methods
//deal with incoming GET and POST requests to the server
app.get("/", function(req, res){
    res.send("Submitted GET Request");
})

//only handles incoming POST requests to the test.json resource
app.post("/data/test.json", function(req, res){
    console.info("Submitting POST Request to Server");
    console.info("Request body: " + req.body);
    //write the file
    fs.writeFile(__dirname + "/../client/data/test.json", req.body, 
    function(err){
        if(err){
            console.error(err); //print out the error in case there is one
            return res.status(500).json(err);
        }

        //resolve the request with the client
        console.info("updated test.json");
        res.send();
    });
})

//tell the express object to create the server and listen on the port
app.listen(port);
console.log("Listening on localhost:" + port);

Всякий раз, когда я пытаюсь распечатать содержимое "req.body", я получаю вывод "[Object Object]". Есть идеи?

EDIT: Моя проблема решена. я изменился

console.info("Request body: " + req.body);

к

console.info("Request body: " + JSON.stringify(req.body));

Я также изменил свой Content-Type в моем POST XMLHTTPRequest на "application/json", чтобы помочь с форматированием.

Теги:
express
xmlhttprequest
body-parser

2 ответа

2
Лучший ответ

"[object Object]" является результатом по умолчанию неявной операции toString JavaScript, которую он использует при попытке записать строковое представление этого объекта в файл.

Попробуйте JSON.stringify(req.data) написать JSON.stringify(req.data).

Кроме того, на стороне клиента - подумайте об изменении заголовка Content-Type чтобы он соответствовал:

xhr.setRequestHeader("Content-Type", "application/json");

  • 0
    Это решило мою проблему! Спасибо.
-1

Если ожидается, что ваше тело сообщения будет JSON, измените эту строку

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

к

 xhr.setRequestHeader("Content-Type", "application/json");
  • 0
    Не помогло с проблемой [object Object], но исправлено форматирование моего объекта JSON.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню