문제

최근에 새로운 프로젝트 및 이 프로젝트에서 사용하는 자바스크립트 콜백 및 라이브러리에서.이제 우리가 사용하는 KOA 그러나 문제가 발생할 때 우리는 시도를 사용 ES6 발전기와 콜백이 있습니다.

//Calback function
function load(callback){
  result = null;
  //Do something with xmla4js and ajax
  callback(result);
  return result;
}

지금 KOA I need to call load 고 응답 json 하도록 클라이언트가 사용하는 이 아래 코드:

router= require('koa-router');
app = koa();
app.use(router(app));

app.get('load',loadjson);

function *loadJson(){
  var that = this;
  load(function(result){
    that.body = result;
  });
}

그러나 나는 이 오류가 발생할 수 있습니다.

_http_outgoing.js:331
throw new Error('Can\'t set headers after they are sent.');
      ^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:331:11)
at Object.module.exports.set (G:\NAP\node_modules\koa\lib\response.js:396:16)
at Object.length (G:\NAP\node_modules\koa\lib\response.js:178:10)
at Object.body (G:\NAP\node_modules\koa\lib\response.js:149:19)
at Object.body (G:\NAP\node_modules\koa\node_modules\delegates\index.js:91:31)
at G:\NAP\Server\OlapServer\index.js:40:19
at G:\NAP\Server\OlapServer\OLAPSchemaProvider.js:1599:9
at _LoadCubes.xmlaRequest.success   (G:\NAP\Server\OlapServer\OLAPSchemaProvider.js:1107:13)
at Object.Xmla._requestSuccess (G:\NAP\node_modules\xmla4js\src\Xmla.js:2113:50)
at Object.ajaxOptions.complete (G:\NAP\node_modules\xmla4js\src\Xmla.js:2024:34)
도움이 되었습니까?

해결책

일을 명확히하기 위해 콜백을

로 작성 해 봅시다.
//Calback function
function load(callback){
    setTimeout(function() {
        var result = JSON.stringify({ 'my': 'json'});
        callback(/* error: */ null, result);
    }, 500);
}
.

KOA World 에서이 제품은 thunk라고합니다. 즉, 프로토 타입 (Err, RES)으로 콜백을 한 콜백 하나만 사용하는 비동기식 함수입니다. https://github.com/visionmedia/node-thub.com/visionmedia/node-thub.com/a>를 확인할 수 있습니다.

이제 미들웨어를

로 써야합니다.
function *loadJson(){
  this.type = 'application/json';
  this.body = yield load;
}
.

다른 팁

KOA는 콜백을 지원하지 않는 미들웨어의 상단에있는 경우 KOA가 생성자 기반으로 발생하기 때문입니다.따라서 기능이 끝나기를 기다리지 않습니다.가장 좋은 솔루션은 귀하의 기능을 약속으로 변환하는 것입니다.약속은 KOA와 함께 일합니다.

나는 Braintree (정규 콜백)와 KOA를 사용하여 매우 비슷한 문제가있었습니다.코드를 기반으로, 내가 필요로하는 유일한 변경은로드 함수와 그것이 어떻게 호출 된 방법을 가지고있었습니다.

router = require('koa-router');
app = koa();
app.use(router(app));

app.get('/load',loadjson);

function *loadJson(){
  this.body = yield load;
}

// Callback function
function load(callback) {
  // Prepare some data with xmla4js and ajax
  whatever_inputs = {...};
  final_method(whatever_inputs, callback);
}
.

위의 Jerome 및 Evan의 설명은 절대적으로 올바른 것입니다.자동으로 수행합니다.

동 썽었는 좋은 아이디어에서 내 보기 Promise 은 더 나은 장기적인 접근 방식이다.많은 라이브러리들은 이미 이 약속에 대한 비동기 대신 의 오래된 노드를 표준 callback(err, data), 고,그들은 죽은 간단한 주위에 포장하는 모든 비동기 코드를 약속하는 것입니다.다른 검사합니다.과 경험을 약속하고 자연스럽게 이해하는 코드,동부하이 무엇인지 찾아 볼 a"썽"입니다.

예:여기에 내가 포장지-아직 약속-기반 jsdom 에는 약속,그래서 얻을 수 있습니다 그것에 내 koa 생성기입니다.

const jsdom = require('node-jsdom');
const koa = require('koa');
const app = koa();
​
app.use(function *() {
  this.body = yield new Promise((resolve, reject) => jsdom.env({
    url: `http://example.org${this.url}`,
    done(errors, { document }) {
      if (errors) reject(errors.message);
      resolve(`<html>${document.body.outerHTML}</html>`);
    },
  }));
});
​
app.listen(2112);

의미,약속 및 발전기 가서 손에 손을 정말로 명확하게 비동기 코드입니다.발전기될 수 있는 다시 입력한 많은 시간과 수익률은 여러 값을하는 동안 약속을 의미한다"난 몇 가지를 위한 데이터를 나중에".결합 된,당신은 하나의 가장 유용한 것들에 대해 Koa:는 능력을 얻을 약속과 동기 값입니다.

편집:여기에는 원래 예으로 포장하고 약속을 반환:

const router = require('koa-router');
const { load } = require('some-other-lib');
const app = koa();
app.use(router(app));

app.get('load', loadjson);

function* loadJson() {
  this.body = yield new Promise(resolve => {
    load(result => resolve(result));
  });
}

KOA의 내장 응답 처리를 바이 패스하여 PresenaCodiceTag 코드를 명시 적으로 설정할 수 있습니다.KOA가 귀하를위한 응답을 처리하는 대신 원시 this.respond = false 객체에 쓰려면이 옵션을 사용하십시오.

헤더는 콜백이 호출되기 전에 기본 제공 응답 처리에 의해 이미 작성되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top