полный комплексный объект json $ http.post к node.js не работает - PullRequest
0 голосов
/ 18 июня 2019

У меня есть запрос на обновление angularJs:

$http.post('http://localhost:3000/updateClub?club='+club)

Node.JS может что-то увидеть, но не может обновить, это узел jsconsole:

Example app listening on port 3000!
(node:3756) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
express deprecated req.param(name): Use req.params, req.body, or req.query instead app.js:118:20
{ club: '[object Object]' }
undefined

Этокод моего node.js:

 app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

    const bodyParser = require('body-parser')

    // create application/json parser
    const jsonParser = bodyParser.json()



    app.post('/updateClub', jsonParser, function (req, res) {

            console.log(req.query);
            console.log(req.query.categorie); //Fails

            var myClub = req.query;

            MongoClient.connect('mongodb://localhost:27017', (err, client) => {
                var db = client.db('myDb');
                db.collection('clubs').updateOne({"_id":myClub._id},{$set:myClub}); 
            });

        })

Это мой клубный объект, обратите внимание, что внутри есть включенный массив, а также объект (есть также прототип <часть, я не знаю какчтобы удалить его): </p>

Object { _id: "5d07e982a7d75a67d6383d6b", nom: "Angers Sp", identifiant: 4, date_creation: Date 1919-01-01T00:00:00.000Z, categorie: "professionel", structure: "Ligue 1", affectations: [], img: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYAAAAILCAYAAADhWEs5AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydd3hURffHv2mb3nsICQkhNNEAoQVBBfnRpFhAioIgwouAovQirwoiSEelKaBIF0SkCUhRREpCkRICoaU3kuym9/n9sWTfBLbembt3s5nP88yT7O6dmXPn7s6ZOXPmDMDhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcs8FCagE49RoXAE4AnB//da/xv/PjZAfA3oC/T5ZvVeO1BQA3HTKVASjU8FkBgPLH/8sBEACVAPIev1cCoLhGGfmP38t/nLfk8bWFj/9XPP5f/jiV6JCNw2EKVwAcWuwAeALwqPHXA4DXE+9V/3WFsoPX1RHXR4rxP2UgB5Cr5nUWgEePU/rj10VSCMup+3AFwFGHDIAPAH8Avo//D3j81xeAX43PXSWSkfM/ivA/hfAI/1MSKY/fSwKQ+jjxWQZHBVcA9Q8ZlB13QwBBAAIfpyAADR7/7yeZdByxyYZSESShtnJIBvAQwAMoZyKcegBXAOaHNZSde2iNFPI4NYSyc+fPnaONDACJUCqEJxNXEGYE7wjqJvYAwgE0hbJjr9nZB0GpBDgcscgAcOdxin+cqv8vlVAujoFwBWDaNMT/Ovpmj/+GAwgGf3Yc06MKyplDtUK4A+A2gFgoTU0cE4N3IqZBIwDPPE6toOzom0LpLcPhmAMKKBXBDQA3H6cbUK5DcCSCKwDj4gngWQAtoezoWz3+30VKoTgcCcmBUhHEArgG4CqAf8FdW40CVwDiEQKgzePUFsqO319SiTicukEllOajS1AqhOq/cimFMke4AmBDYyg7+ZodvoekEnE45sd9AJehVAYxAC6AKwUquAIwHG8AnQB0ANARyg6f72rlcIwPARAH4CKA8wDOQbm2UCGlUHUJrgC0Yw3gOfyvw4+C0tWSw+GYJo…", adresse: {…}, ville: "Angers", … }

Я также получаю это сообщение об ошибке в Firefox, но, похоже, node.js получает данные в любом случае, когда его параметры:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:3000/updateClub?club=[object%20Object]. (Reason: CORS request did not succeed).

Я был бы очень признателенесли кто-то может мне помочь, спасибо.Другие запросы node.js работают только с параметрами, а не с полным объектом.

Моя коллекция клубов работает нормально и уже содержит 25 клубов

РЕДАКТИРОВАТЬ 1: Измененомой http-запрос к:

$http.post('http://localhost:3000/updateClub',{data:$.param(club)})

И теперь, кажется, объект node.js req.body получает объект (документ):

{ data:
   '_id=5d07e982a7d75a67d6383d6b&nom=Angers+Sporting+Club+de+l\'Ouest+(SCO+Angers)&identifiant=4&date_creation=Wed+Jan+01+1919+00%3A00%3A00+GMT%2B0000+(Central+European+Standard+Time)&categorie=professionel&structure=Ligue+1&img=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAYAAAAILCAYAAADhWEs5AAAABmJLR0QA%2FwD%2FAP%2BgvaeTAAAgAElEQVR4nOydd3hURffHv2mb3nsICQkhNNEAoQVBBfnRpFhAioIgwouAovQirwoiSEelKaBIF0SkCUhRREpCkRICoaU3kuym9%2Fn9sWTfBLbembt3s5nP88yT7O6dmXPn7s6ZOXPmDMDhcDgcDofD4XA4HA6Hw%2BFwOBwOh8PhcDgcs8FCagE49RoXAE4AnB%2F%2Fda%2Fxv%2FPjZAfA3oC%2FT5ZvVeO1BQA3HTKVASjU8FkBgPLH%2F8sBEACVAPIev1cCoLhGGfmP38t%2FnLfk8bWFj%2F9XPP5f%2FjiV6JCNw2EKVwAcWuwAeALwqPHXA4DXE%2B9V%2F3WFsoPX1RHXR4rxP2UgB5Cr5nUWgEePU%2Frj10VSCMup%2B3AFwFGHDIAPAH8Avo%2F%2FD3j81xeAX43PXSWSkfM%2FivA%2FhfAI%2F1MSKY%2FfSwKQ%2BjjxWQZHBVcA9Q8ZlB13QwBBAAIfpyAADR7%2F7

Больше нет предупреждений cors

Итак, это мой последний код node.js, теперь:

app.post('/updateClub', jsonParser, function (req, res) {

    console.log(req.body); // Can see the object in the console !

    var myClub = req.body;
    MongoClient.connect('mongodb://localhost:27017', (err, client) => {
        var db = client.db('myDb');
        db.collection('clubs').updateOne({"_id":myClub._id},{$set:myClub}); // Fails
    });

})

Он все еще не обновляет объект на mongodb

EDIT 2:

спасибо, Джордж, Изменил мой интерфейсный запрос на это:

  $http.post('http://localhost:3000/updateClub',club)

И теперь, это то, что отображает консоль узла, правильно сформированный объект (извините, не могу показать все, естьнадоедливые фотографии base64):

{ _id: '5d07e982a7d75a67d6383d6b',
  nom: 'Angers Sporting Club',
  identifiant: 4,
  date_creation: '1919-01-01T00:00:00.000Z',
  categorie: 'professionel',
  structure: 'Ligue 1',
  affectations: [],
  img: ...

Это мой последний код node.js:

app.post('/updateClub', jsonParser, function (req, res) {

    console.log(req.body); // Can see the well formed object in the console !

    var myClub = req.body;
    MongoClient.connect('mongodb://localhost:27017', (err, client) => {
        var db = client.db('myDb');
        db.collection('clubs').updateOne({"_id":myClub._id},{$set:myClub}); // There must be a mispelling, i need to replace the whole object (document)
    });

})

РЕДАКТИРОВАТЬ 3: попытка с replaceOne ()

app.post('/updateClub', jsonParser, function (req, res) {

    console.log(req.body); // Can see the object in the console !

    var myClub = req.body;
    MongoClient.connect('mongodb://localhost:27017', (err, client) => {
      if (err) throw err;       
     var db = client.db('myDb');
        db.collection('clubs').replaceOne({"_id":myClub._id},myClub); // Fails silently
    });

    })

примечание: перепробовал много вещей, insert () работает, но не replaceOne ()!

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

Заменил мой node.js наэтот :

try {
    db.collection('clubs').replaceOne({_id:"5d07e982a7d75a67d6383d6b"},myClub)
} catch (e){
   print(e);
}

Это все еще не обновление!Может быть потому, что документ myClub слишком большой?console.log (myClub._id) работает, но метод replaceOne () молча завершается сбоем!

console.log (typeof (myClub)) выдает объект, поэтому все должно быть в порядке!

РЕДАКТИРОВАТЬ 6: Объект ANGULARJS не совпадает с объектом, который получил узел node.js!

Я обнаружил ошибку, анализируемый JSON Node.js содержит [Object] вместо вложенных объектовданные:

adresse:
   { address_components:
      [ [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object],
        [Object] ],
     adr_address:

Как я могу избавиться от этого и получить данные реальных объектов?(Sentobject AngularJs содержит все данные «object», затем node.js заменяет их на [object], почему, пожалуйста, помогите?

EDIT 7: Изменил мой интерфейс на этот:

 $http.post('http://localhost:3000/updateClub',club, {headers: {'Content-Type': 'application/json'} })

Изменил код моего node.js следующим образом:

const jsonParser = bodyParser.json()
app.use(bodyParser.json({
    inflate: true,
    strict:false
}));

Мои вложенные объекты JSON по-прежнему не анализируются , вместо этого есть [объект]

Я перепробовал все варианты: https://github.com/expressjs/body-parser?_ga=1.163627447.940445150.1418712389#bodyparserurlencodedoptions

Что мне делать, чтобы получить содержимое моих вложенных объектов ??

Редактировать 8

Я получил ответ от официального сотрудника:

По умолчанию консольный журнал Node.js показывает только глубину 2.:

так

console.dir (req.body, {deep: Infinity}) правильно показывает весь документ JSON.

Так что я действительно не знаю, почемуreplaceOne () не работает, я заблокирован, у меня нет объяснений.

РЕДАКТИРОВАТЬ 9: ПОЛУ решено

Я получил этот код, но яне думаю, что это лучше всего сделать, я добавилвторой идентификатор, который исходил от моего старого bdd, поэтому я использую его в качестве фильтра и удаляю сгенерированный mongoDb _id, который генерировал ошибку, тогда замена работает:

  app.post('/updateClub', function (req, res) {


        myClub = req.body;

        delete myClub._id;

        MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => {


            if (err) throw err;
            var db = client.db('myDb');

            try {
            db.collection('clubs').replaceOne({"identifiant":myClub.identifiant},myClub)
            } catch (e){
               print(e);
            }
        })
    })

Редактировать: попытался удалитьцитаты из myClub._id и попробовал первый код, предоставленный без удачи myClub._id = myClub._id.replace (/ ["'] / g," ");

Это myClub._id: 5d07e982a7d75a67d6383d6cвыглядит хорошо

ФИНАЛ:

Хорошо, я нашел там объяснение:

https://litote.org/kmongo/dokka/kmongo/org.litote.kmongo/com.mongodb.client.-mongo-collection/replace-one-with-filter.html

Ну, янеобходимо использовать _id, чтобы заменить его, это более удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...