В настоящее время я преподаю больше кода сервера, в частности, используя 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", чтобы помочь с форматированием.
"[object Object]"
является результатом по умолчанию неявной операции toString
JavaScript, которую он использует при попытке записать строковое представление этого объекта в файл.
Попробуйте JSON.stringify(req.data)
написать JSON.stringify(req.data)
.
Кроме того, на стороне клиента - подумайте об изменении заголовка Content-Type
чтобы он соответствовал:
xhr.setRequestHeader("Content-Type", "application/json");
Если ожидается, что ваше тело сообщения будет JSON, измените эту строку
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
к
xhr.setRequestHeader("Content-Type", "application/json");