javascript - Koa JS - 调用 API 后无法发送响应。总是收到 404

标签 javascript node.js api koa koa2

这是我的代码:

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

let email = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f12061a121e16133f18121e1613511c1012" rel="noreferrer noopener nofollow">[email protected]</a>"
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

我已经用 Express 尝试过了,效果非常好,但后来我想尝试一下 Koa。如果我只需输入 ctx.body = 'some data' 它就可以正常工作无需调用任何函数。我认为即使我写了await,koa也没有等待。


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

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

但它总是给出“未找到”。

我也想知道为什么会出现这种情况。我应该做什么才能让它发挥作用。

最佳答案

所以,这是一个混合基于回调的代码和基于 promise 的代码的示例,使事情变得有点棘手。发生的事情是这样的:https_req 返回一个 Promise,但这仅仅是因为所有声明 async 的函数都返回 Promise。当 HTTPS 请求的结果可用时,它不会resolve。因此 await 它不会做你认为它会做的事情!执行立即继续,并且由于没有更多语句并且响应正文从未设置,因此结果是 404。

相反,您应该等待 HTTPS 响应。这个想法是监听 end 事件,将所有 block 相加直到收到它,然后才对结果执行某些操作。您在第一个 block 之后调用回调,这可能有效,但不能保证这样做。

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

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

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

ctx.body = await https_req(options)

关于javascript - Koa JS - 调用 API 后无法发送响应。总是收到 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48072717/

相关文章:

javascript - 在 Ionic index.html 中的何处包含 jQuery

javascript - Mongoose 的正则表达式不传递不从Angular的HTTP服务传递到nodejs

api - bugzilla 的 Rest API

javascript - 当我使用 "require"时,Webstorm 无法识别我的全局函数

api - CSRF 可以发生在 API 中吗?

php - SOAP 客户端 TypeScript

javascript - 如何在 jQuery 中延迟鼠标悬停事件

javascript - 在 c [Codemirror] 中自动完成

javascript - 如何使用javascript从十进制数中获取正常数

node.js - 如何将 .sequelizerc 配置放在 package.json 中?