2017-02-23 13 views
0

ノード+エクスプレスサーバーからArangodbのFoxxサービスへのポストリクエストを送信しようとしています。ノード側でノードからFoxxサービス(ArangoDB)へのHTTPポストリクエストの送信

:フォックス側で

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

そして、私はFoxxから同じログを取得します。

どうすればいいですか?

ここは、Foxxインターフェイスでの私の操作のスクリーンショットです。テスト用のリクエスト本体を指定できないのは正常ですか?

enter image description here

+0

あなたはNode.jsの側からこれを試してみました: 'リターンrequestify.post(ルート、JSON.stringify(ボディ));私はこれを試してみました' –

+0

@DavidThomasのおかげで、それdid not work – user6403833

+0

Foxx側では、req.bodyでJSON.stringifyまたはJSON.parseを試してみてください。また、[request](https://github.com/request/request)モジュールを試してみてください。これを使ってnode.jsからFoxxサービスを呼び出す際に問題はなく、うまくいきます。 –

答えて

3

私はあなたが.postの一部として期待体が存在することがフォックスでのエンドポイントに指定されていないので、理由があると思います。

Foxx MicroServicesを定義する方法を試すにはしばらく時間がかかりましたが、パターンを決める前にいくつかのArangoDBサンプルコードを読みました。

私はFoxx MicroServiceコードを拡張可能な方法ですばやくモックアップし、ルートをモデルから分離する方法を説明しました。

例を動作させるために、これらを例として使用してください。

私は、「VisitedBy」と呼ばれる2つのドキュメントコレクション「Drop」と「Bot」を結合したエッジコレクションがあることを前提にしています。

これらのファイルはすべて、あなたのフォックスのMicroServiceに格納されています

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 view of service

あなたはデータ構造hereを定義するためにJOIの使用についての詳細を学ぶことができます。

joiに少し慣れていますが、いくつかの良い動作例が得られれば、着信データと発信データに対して素晴らしいデータ定義を定義できます。

私がこれを助けてくれることを願っています。基本的なMicroServiceコードモデルを入手するのは難しかったですが、この例では多くのことができるはずですが、それは良いスタートスポットになるはずです。

+0

Davidさん、ありがとうございました! – user6403833

+0

あなたはそれを得ることができてうれしい、Foxxと幸運! –

0

David Thomasが答えたところで、ルータコード(Foxx側)にボディフォーマットを指定する必要がありました。要するに

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')  
関連する問題