Koa JS - 调用 API 后无法发送响应。总是得到 404
Koa JS - Cannot Send Response after calling an API. Always Getting 404
这是我的代码:
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
我已经用 express 试过了,它工作得很好,但后来我想试一试 Koa。如果我只输入 ctx.body = 'some data'
而不调用任何函数,它就可以正常工作。我觉得写await koa也不等待
我也在回调函数中尝试了 async await :
await https_req(options, async (result) => {
console.log("final result: ",result)
ctx.body = await result
})
但它总是给出 "Not Found"。
我也想知道为什么会这样。我应该怎么做才能让它发挥作用。
所以,这是一个混合基于回调的代码和基于承诺的代码的示例,这让事情变得有点棘手。发生的事情是这样的:https_req
return 是一个承诺,但这只是因为声明的所有函数 async
return 承诺。当 HTTPS 请求的结果可用时,它不做的是 resolve
。 await
因此,它并没有按照您的想法行事!执行立即继续,并且由于没有更多的语句并且从未设置响应主体,结果是 404。
相反,您应该等待 HTTPS 响应。这个想法是监听 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()
})
}
希望这显然不是一个可靠的解决方案,不进行错误检查等。至少,您可以像这样调用它:
ctx.body = await https_req(options)
这是我的代码:
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
我已经用 express 试过了,它工作得很好,但后来我想试一试 Koa。如果我只输入 ctx.body = 'some data'
而不调用任何函数,它就可以正常工作。我觉得写await koa也不等待
我也在回调函数中尝试了 async await :
await https_req(options, async (result) => {
console.log("final result: ",result)
ctx.body = await result
})
但它总是给出 "Not Found"。
我也想知道为什么会这样。我应该怎么做才能让它发挥作用。
所以,这是一个混合基于回调的代码和基于承诺的代码的示例,这让事情变得有点棘手。发生的事情是这样的:https_req
return 是一个承诺,但这只是因为声明的所有函数 async
return 承诺。当 HTTPS 请求的结果可用时,它不做的是 resolve
。 await
因此,它并没有按照您的想法行事!执行立即继续,并且由于没有更多的语句并且从未设置响应主体,结果是 404。
相反,您应该等待 HTTPS 响应。这个想法是监听 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()
})
}
希望这显然不是一个可靠的解决方案,不进行错误检查等。至少,您可以像这样调用它:
ctx.body = await https_req(options)