Koa JS - 调用API后无法发送响应。永远得到404

时间:2018-01-03 07:05:43

标签: javascript node.js api koa koa2

这是我的代码:

const koa = require('koa');
const app = new koa();
const https = require('https')

let email = "myemail@gmail.com"
let password = "mysecret"

var options = {
    host: 'myhost',
    port: 443,
    path: '/api/login?email=' + email + '&password=' + password,
    method: 'POST'
};

async function https_req(options, callback) {
    https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            callback(chunk)        
        })
    }).end();
}

app.use(async (ctx, next) => {
    let res = await https_req(options, (result) => {
        console.log("final result: ",result)
        ctx.body = result
    })
})

app.listen(3000)

在此代码中,它在控制台中提供了正确的结果,但在网页中仅显示Not Found

我用快递尝试了这个并且它工作得非常好,但后来我想给Koa一个镜头。如果我只是输入ctx.body = 'some data'而不调用任何函数,它工作正常。我认为即使我写等待,koa也不会等待。

我还在回调函数中尝试了异步等待:

await https_req(options, async (result) => {
    console.log("final result: ",result)
    ctx.body = await result
})

但它总是给出" Not Found"。

我也想知道为什么会这样。我该怎么做才能使它发挥作用。

1 个答案:

答案 0 :(得分:2)

因此,这是混合基于回调的代码和基于承诺的代码的示例,使事情变得有点棘手。发生了什么:https_req返回一个promise,但只是因为声明async的所有函数都返回promise。当HTTPS请求的结果可用时,它不会做resolve。 {{1}因此它不会做你想象的那样!执行立即继续,因为没有更多的语句,并且永远不会设置响应主体,结果就是404。

相反,您应该等待HTTPS响应。我们的想法是监听await事件,将所有块加起来直到收到它,然后才对结果做一些事情。您在第一个块之后调用了回调,这可能有效,但不能保证这样做。

当我们把这些东西放在一起时,我们会得到这样的东西:

end

希望很明显,这不是一个强大的解决方案,不会进行错误检查等。至少,您可以像这样调用它:

async function https_req (options) {
  return new Promise(resolve => {
    let result = ''

    http.request(options, res => {
      res.setEncoding('utf8')
      res.on('data', chunk => { result += chunk })
      res.on('end', resolve)
    }).end()
  })
}