Express 在异步函数中发送响应

Express 在异步函数中发送响应,express,asynchronous,async-await,request,Express,Asynchronous,Async Await,Request,我需要返回一个标签数组,但到目前为止,我只能返回1个标签。我得到的错误是“发送到客户端后无法设置头”。所以我尝试了res.write并将res.end放在for循环之后,然后我得到了一个明显的错误,即在res.write之前执行res.end。我如何解决这个问题 for(let i=0;i<arr.length;i++){ request.get(arr[i], function (error, response, body) { if (!error && respo

我需要返回一个标签数组,但到目前为止,我只能返回1个标签。我得到的错误是“发送到客户端后无法设置头”。所以我尝试了res.write并将res.end放在for循环之后,然后我得到了一个明显的错误,即在res.write之前执行res.end。我如何解决这个问题

for(let i=0;i<arr.length;i++){
request.get(arr[i], function (error, response, body) {
  if (!error && response.statusCode == 200) {
    myfunction();
    async function myfunction(){
    const Labels = await Somefunctioncallwhoseresponseigetlater(body)
    res.send(Labels);
}
}
});}
这个代码的错误是

“解析程序:异步解析程序


TypeError:无法对'undefined'或'null'的属性
解析程序进行分解。“

您试图在
for
循环的
内部调用
res.send()
。这意味着你将尝试不止一次地打电话给它。你不能那样做。您可以为任何给定的http请求发送一个响应,
res.send()
发送整个响应。因此,当您尝试在循环中再次调用它时,您可以看到您看到的警告

如果您试图发送一个标签数组,则需要先累积标签数组,然后调用
res.send()
发送最后一个数组

此处不显示整个调用上下文,但进行以下假设:

  • SomeFunctionCallWhoserResponseGetLater()
    返回一个承诺,该承诺在完成时解析
  • 您希望累积在循环中收集的所有标签
  • 标签
    变量是一个数组
  • http请求返回一个文本响应。如果它返回类似于JSON的其他内容,则需要将
    .text()
    更改为
    .JSON()
  • 然后你可以这样做:

    const got = require('got');
    
    async function getDataSendResponse(res) {
        let allLabels = [];
        for (let url of arr) {
            let body = await got(url).buffer();
            const labels = await Somefunctioncallwhoseresponseigetlater(body);
            allLabels.push(...labels);
        }
        res.send(allLabels);
    }
    

    注意,我使用的是
    get()
    库,而不是不推荐使用的
    request()
    库,这是因为
    request()
    没有被推荐使用,而且当您有一个支持承诺的http库(如
    get()
    这样做)时,这种类型的代码更容易使用“TypeError:无法对'undefined'或'null'的属性
    解析程序
    进行分解。”。“我的http请求返回一个image@bigdaddy-西风-我们需要更多的细节,以提供准确的工作代码。这应该向您展示正确的结构-您可能可以修改它以适合您的特定数据。如果您需要进一步的帮助,请显示
    somefunctioncallwhosersponseigetlater(body)
    的代码,并共享一个示例URL,您可以从中请求并获取图像。我需要能够准确地看到该响应的样子,以及该函数期望的数据输入。@Bigdady zephyr-仅供参考,您可以将
    .text()
    更改为
    .buffer()
    ,以从http请求中获取二进制数据,但是我需要我在前面的评论中要求的信息来进一步帮助(…图像标签);}res.send(所有标签);}`@Bigdady zephyr-在上面的评论中,这是你的有效解决方案吗?还是你在问一个关于这个问题的问题?另外,请明确你的问题现在是否已经解决,或者某些东西是否仍然不起作用。不,问题还没有解决。是的,错误来自哪里?来自哪行代码?NPM模块的功能是什么kognition.detectLabels()
    来自?还是您自己的代码?不,它是AWS Rekognition API。您能否提供一个您查询以获取这些图像的URL?
    const got = require('got');
    
    async function getDataSendResponse(res) {
        let allLabels = [];
        for (let url of arr) {
            let body = await got(url).buffer();
            const labels = await Somefunctioncallwhoseresponseigetlater(body);
            allLabels.push(...labels);
        }
        res.send(allLabels);
    }