从节点发送HTTP POST请求来福克斯服务(ArangoDB)(Sending HTTP Post

2019-09-25 20:28发布

我想从发送节点+ Express服务器POST请求对Arangodb我的福克斯服务。

在节点方面:

var route = arangopi + '/edge/' + col.name ;
var body = {data: data, from: fromId, to: toId} ;
console.log('|| body :', route, body) ;

>> || body : http//XXX/_db/my-DB/my-foxx-service/path/to/visitedBy { data: { isBackup: true, text: '', isHint: true, continuance: 3441.5 }, from: 'Drop/27237133', to: 'Bot/41116378' }

return requestify.post (route, body)

在福克斯的一面,我收到了请求,但日志告诉我,它没有任何的身体:

router.post('/path/to/:param', function (req, res) {
  console.log ('|| body :', req.body)
  var data = req.body ;
  var result = api.DoSomething (req.stateParams.param, data)
   res.send(result)
})
.response(joi.object().required(), 'Entry stored in the collection.')
.summary('Summary')
.description('Description') 

>>  || body : [Object { "binarySlice" : function binarySlice() { [native code] }, "asciiSlice" : function asciiSlice() { [native code] }, "base64Slice" : function base64Slice() { [native code] }, "ucs2Slice" : function ucs2Slice() { [native code] }, "hexSlice" : f...

在节点侧我也尝试了“请求”模块。

return request.post(route, {form:body}, function (error, response, body) {
  console.log('error:', error);
  console.log('statusCode:', response && response.statusCode);
  console.log('body:', body);
  return response ;
});

而我从福克斯相同的日志。

我该怎么办错了吗?

这里是我的福克斯界面上操作的屏幕截图。 这是正常的,我不能指定一个请求主体进行测试?

Answer 1:

我想原因是因为你没有在福克斯终点规定,有预期的。员额的部分身体。

我花了一段时间来制定出定义福克斯微服务的一种方式,我通过一些ArangoDB示例代码读取之前我上的图案解决。

为了帮助你开始,我提供了我如何将迅速嘲笑了福克斯微服务代码的方式,可扩展性,让您在路线从模型中分离出来。

使用这些作为例子,让您的工作例子。

我做了假设,有两个文件集,“降”和“僵尸”与边集合,加入他们所谓的“VisitedBy”。

所有这些文件都存储在您的福克斯微服务:

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];
  }
};

您的服务应该是这样的扬鞭界面:

您可以了解更多有关使用淳佳来定义数据结构在这里 。

这需要一点时间来适应淳佳,但一旦你得到一些很好的工作实例,你可以定义传入和传出的数据大数据的定义。

我希望这可以帮助,这是我很难得到一个基本的microService代码模型制作工作明确怎么会事,我敢肯定,很多可以在这个例子中进行,但它应该是一个很好的起点位置。



Answer 2:

正如大卫·托马斯在他的回答解释,我需要指定我的路由器代码(福克斯侧)正文格式。

简而言之 :

const bodySchema = joi.object().required().description('Data Format');

router.post('/path/to/:param', function (req, res) {
  var data = req.body ;
  var result = api.DoSomething (req.stateParams.param, data)
  res.send(result)
})
.body(bodySchema, 'Body data')
.response(joi.object().required(), 'Entry stored in the collection.')
.summary('Summary')
.description('Description')    


文章来源: Sending HTTP Post request from node to Foxx service (ArangoDB)