У меня есть запрос на обновление 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, чтобы заменить его, это более удобно.