2016-06-28 1 views
0

Я пытаюсь отправить пост запрос с заголовком в koa.js маршрутов, как это:отправить пост запрос с заголовком в koa.js маршрутов

Вот функция запроса

const request = require('request').defaults({ 
 
    json: true 
 
}); 
 

 
function *requestPromise(url, method, header, body) { 
 
    return new Promise(function (resolve, reject) { 
 
    delete header["content-length"]; 
 
    let newHeader = { 
 
     "user-agent": header["user-agent"], 
 
     "host": header["host"], 
 
     "connection": 'keep-alive' 
 
    }; 
 
    console.log(newHeader) 
 
    request({ 
 
     method: method, 
 
     url: url, 
 
     body: body, 
 
     headers: newHeader 
 
    }, function(error, httpResponse, body) { 
 
     if (error) { 
 
     console.error(url + " : " + error); 
 
     } else if (httpResponse.statusCode !== 204) { 
 
     reject(body.message); 
 
     } else { 
 
     resolve(body); 
 
     } 
 
    }); 
 
    }); 
 
}

Вот маршрут:

router.post('/v3_6/autoevents', function *() { 
 
     // save to db 
 
     yield EventAuto.save(this.request.body); 
 

 
     let akkaEndConfig = { 
 
      url: "http://127.0.0.1:8080/v3_6/autoevents", 
 
      method: 'POST', 
 
      header: this.header, 
 
      body: this.request.body 
 
     }; 
 

 
     // request to another server 
 
     yield requestPromise(akkaEndConfig.url, akkaEndConfig.method, akkaEndConfig.header, akkaEndConfig.body); 
 

 
     this.status = 204; 
 
    });

Но когда я хочу запустить этот сервер, получил эту ошибку:

xxx POST /api/v3_6/autoevents 500 195ms - 
 
TypeError: Cannot read property 'name' of undefined 
 
     at Object.callee$1$0$ (/koa/src/lib/error-trace.js:10:11) 
 
     at tryCatch(/koa/node_modules/regenerator/runtime.js:61:40) 
 
     at GeneratorFunctionPrototype.invoke [as _invoke](/node_modules/regenerator/runtime.js:328:22) 
 
     at GeneratorFunctionPrototype.prototype.(anonymous function) [as throw] (/node_modules/regenerator/runtime.js:94:21) 
 
     at onRejected (/node_modules/co/index.js:81:24) 
 
     at run (/node_modules/core-js/modules/es6.promise.js:104:47) 
 
     at /node_modules/core-js/modules/es6.promise.js:115:28 
 
     at flush (/node_modules/core-js/modules/$.microtask.js:19:5) 
 
     at doNTCallback0 (node.js:428:9) 
 
     at process._tickDomainCallback (node.js:398:13)

Я просто хочу, чтобы маршрут requset форме SERVERA к ServerB. Является ли этот метод неправильным?

ответ

2

Если вы хотите отправить запрос от сервераA к серверу B, я создал пример приложения по тому, чего вы хотите достичь.

'use strict'; 
var koa = require('koa'); 
var route = require('koa-route'); 
var request = require('request-promise'); 
var rawBody = require('raw-body'); 

var appA = koa(); 
var appB = koa(); 

appA.use(route.get('/v3_6/autoevents', function *(){ 
    let response = yield request({ 
    method: 'POST', 
    url: 'http://127.0.0.1:8081/v3_6/autoevents', 
    headers: { 'content-type': 'application/json' }, 
    body: JSON.stringify({ param1: 'Hello World from A' }) 
    }); 

    this.body = response; 
})); 

appB.use(route.post('/v3_6/autoevents', function *(){ 
    this.req.body = yield rawBody(this.req,{limit:'10kb', encoding:'utf8'}); 
    this.req.body = JSON.parse(this.req.body); 
    this.body = 'Hello from World B; ' + this.req.body.param1; 
})); 

appA.listen(8080); 
appB.listen(8081); 

Сервер (appA) имеет конечную точку с именем /v3_6/autoevents использованием GET метода доступа он будет посылать POST запрос на Сервер Б «ы (appB) /v3_6/autoevents конечную точку в том, что в свою очередь будет посылать усеченное значение с корпусом запроса А и Hello World from B;.

Окончательный результат после его выполнения в браузере с помощью http://127.0.0.1:8080/v3_6/autoevents будет Hello World from B; Hello World from A

Смежные вопросы