gpt4 book ai didi

node.js - 使用回调时无法在 KOA 中设置 Header

转载 作者:搜寻专家 更新时间:2023-10-31 23:31:48 24 4
gpt4 key购买 nike

最近我参与了一个使用 javascript 回调的新项目。我用的是koa框架。但是当我调用这条路线时:

function * getCubes(next) {
var that = this;
_OLAPSchemaProvider.LoadCubesJSon(function(result) {
that.body = JSON.stringify(result.toString());
});
}

我收到这个错误:

_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:42: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:2110:50)
at Object.ajaxOptions.complete (G:\NAP\node_modules\xmla4js\src\Xmla.js:2021:34)

最佳答案

问题是您的异步​​调用 LoadCubesJSon() 需要一段时间才能返回,但 Koa 并不知道这一点并继续控制流程。这基本上就是 yield 的用途。

“Yieldable”对象包括 promises、generators 和 thunks(以及其他)。

我个人更喜欢使用 'Q' library 手动创建 promise .但您可以使用任何其他 promise 库或 node-thunkify创建一个thunk。

这是使用 Q 的简短但有效的示例:

var koa = require('koa');
var q = require('q');
var app = koa();

app.use(function *() {
// We manually create a promise first.
var deferred = q.defer();

// setTimeout simulates an async call.
// Inside the traditional callback we would then resolve the promise with the callback return value.
setTimeout(function () {
deferred.resolve('Hello World');
}, 1000);

// Meanwhile, we return the promise to yield for.
this.body = yield deferred.promise;
});

app.listen(3000);

因此您的代码将如下所示:

function * getCubes(next) {
var deferred = q.defer();

_OLAPSchemaProvider.LoadCubesJSon(function (result) {
var output = JSON.stringify(result.toString());
deferred.resolve(output);
});

this.body = yield deferred.promise;
}

关于node.js - 使用回调时无法在 KOA 中设置 Header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037287/

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