Ich denke, der Grund ist, weil Sie nicht in dem Endpunkt in Foxx angegeben haben, dass es ein Körper als Teil des .post erwarten ist.
Es hat eine Weile gedauert, bis ich einen Weg gefunden hatte, Foxx MicroServices zu definieren, und ich las eine Reihe von ArangoDB-Beispielcodes, bevor ich mich auf ein Muster festlegte.
Um Ihnen den Einstieg zu erleichtern, habe ich Ihnen vorgestellt, wie ich schnell den Foxx MicroService-Code auf eine erweiterbare Weise nachbearbeiten kann, damit Sie Ihre Routen von Ihren Modellen trennen können.
Verwenden Sie diese Beispiele, um Ihr Beispiel zum Laufen zu bringen.
Ich habe Annahmen gemacht, dass es zwei Dokumentensammlungen gibt, 'Drop' und 'Bot' mit einer Kantensammlung, die sie verbindet, 'VisitedBy' genannt.
Alle diese Dateien sind auf Ihrem Foxx Micro gespeichert:
main.js
'use strict';
module.context.use('/v1/visitedBy', require('./routes/visitedBy'), 'visitedBy');
routes/visitedBy.js
'use strict';
const request = require('@arangodb/request');
const joi = require('joi');
const createRouter = require('@arangodb/foxx/router');
const VisitedBy = require('../models/visitedBy');
const visitedDataSchema = joi.object().required().description('Data that tracks a visited event');
const router = createRouter();
module.exports = router;
/*********************************************
* saveVisitedBy
* Path Params:
* none
* Query Params:
* none
* Body Params:
* body (required) The data that is used to record when something is visited
*/
router.post('/', function (req, res) {
const visitedData = req.body;
const savedData = VisitedBy.saveVisitedByData(VisitedBy.fromClient(visitedData));
if (savedData) {
res.status(200).send(VisitedBy.forClient(savedData));
} else {
res.status(500).send('Data not saved, internal error');
}
}, 'saveVisitedBy')
.body(visitedDataSchema, 'visited data')
.response(VisitedBy.savedDataSchema, 'The response after the data is saved')
.summary('Save visited data')
.description('Save visited data');
models/visitedBy.js
'use strict';
const _ = require('lodash');
const joi = require('joi');
const db = require('@arangodb').db;
const visitedByEdgeCollection = 'VisitedBy';
/*
Schema for a response after saving visitedBy data
*/
const savedDataScema = {
id: joi.string(),
data: joi.object(),
_from: joi.string(),
_to: joi.string()
};
module.exports = {
savedDataSchema: savedDataScema,
forClient(obj) {
// Implement outgoing transformations here
// Remove keys on the base object that do not need to go through to the client
if (obj) {
obj = _.omit(obj, ['_id', '_rev', '_oldRev', '_key']);
}
return obj;
},
fromClient(obj) {
// Implement incoming transformations here
return obj;
},
saveVisitedByData(visitedData) {
const q = db._createStatement({
"query": `
INSERT {
_from: @from,
_to: @to,
data: @data,
date: DATE_NOW()
} IN @@col
RETURN MERGE ({ id: NEW._id }, NEW)
`
});
q.bind('@col', visitedByEdgeCollection);
q.bind('from', visitedData.from);
q.bind('to', visitedData.to);
q.bind('data', visitedData.data);
const res = q.execute().toArray();
return res[0];
}
};
Ihr Dienst sollte in der Swagger-Schnittstelle wie folgt aussehen:
Sie können erfahren Sie mehr über joi mit here Datenstrukturen zu definieren.
Es ist ein bisschen gewöhnungsbedürftig, aber sobald Sie ein paar gute Arbeitsbeispiele bekommen, können Sie großartige Datendefinitionen für eingehende und ausgehende Daten definieren.
Ich hoffe, das hilft, es war schwierig für mich, ein grundlegendes MicroService-Code-Modell zu bekommen, das klar machte, wie die Dinge funktionierten, ich bin sicher, dass für dieses Beispiel eine Menge getan werden kann, aber es sollte ein guter Startpunkt sein.
Haben Sie schon versucht, diese von der node.js Seite: 'return requestify.post (Route, JSON.stringify (Körper));' –
@DavidThomas Dank ich das versucht, aber es hat nicht funktioniert – user6403833
Wie wäre es auf der Foxx-Seite, versuchen Sie JSON.stringify oder JSON.parse auf dem req.body. Sie könnten auch das [request] (https://github.com/request/request) -Modul versuchen, ich benutze es, um Foxx-Dienste von node.js aufzurufen und hatte keine Probleme, läuft gut. –