gpt4 book ai didi

node.js - 从 Node 发送 HTTP Post 请求到 Foxx 服务 (ArangoDB)

转载 作者:可可西里 更新时间:2023-11-01 16:54:33 26 4
gpt4 key购买 nike

我正在尝试从 Node + 快速服务器向我在 Arangodb 上的 Foxx 服务发送一个发布请求。

在 Node 端:

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)

在 Foxx 方面,我收到了请求,但日志告诉我它没有正文:

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...

在 Node 端,我还尝试了“请求”模块。

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

我从 Foxx 获得了相同的日志。

我做错了什么?

下面是我在Foxx界面上的操作截图。不能指定request body进行测试正常吗?

enter image description here

最佳答案

我认为原因是因为您没有在 Foxx 的终点指定 .post 中应该有一个正文。

我花了一段时间才想出一种定义 Foxx 微服务的方法,在确定模式之前,我通读了许多 ArangoDB 示例代码。

为了帮助您入门,我提供了如何以可扩展的方式快速模拟 Foxx 微服务代码,从而允许您将路由与模型分开。

使用这些作为示例让您的示例正常工作。

我假设有两个文档集合,“Drop”和“Bot”,有一个边集合将它们连接起来,称为“VisitedBy”。

所有这些文件都存储在您的 Foxx 微服务中:

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

您的服务在 Swagger 界面中应如下所示: Swagger view of service

您可以了解有关使用 joi 定义数据结构的更多信息 here .

使用 joi 需要一点时间,但是一旦您获得了一些良好的工作示例,您就可以为传入和传出数据定义出色的数据定义。

我希望这会有所帮助,我很难获得一个基本的微服务代码模型来清楚地说明事情是如何运作的,我相信这个例子可以做很多事情,但它应该是一个很好的起点。

关于node.js - 从 Node 发送 HTTP Post 请求到 Foxx 服务 (ArangoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com