如何使用nodejs中的回调异步接收多个响应?

时间:2017-02-28 16:05:31

标签: javascript node.js callback fs

一旦我从客户端获得参数,我想匹配文件系统中的字符串并将匹配的数据发送回客户端。我正在尝试熟悉回调,所以在下面的代码中,当我调用回调时,它会向我发送带有正确数据的响应,但它会抛出错误 - 请参阅下面的粘贴代码。

app.js:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define SIZE 1024

int main(int argc, char **argv)
{
    char buffer[SIZE+1];
    int port = 6666;
    char msg[1000];

    int sockfd, recv_size;
    struct sockaddr_in server_addr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    inet_aton("127.0.0.1", &server_addr.sin_addr);

    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("connect");
        exit(1);
    }

    while (1)
    {
        printf("> ");
        fgets (msg, 999, stdin);

        if ((send(sockfd, msg, strlen(msg), 0) < 0))
        {
            close(sockfd);
            if (errno != 0)
            {
                perror("recv");
                exit(1);
            }
        }

        if ((recv_size = recv(sockfd, buffer, SIZE, 0)) == 0)
        {
            close(sockfd);
            if (errno != 0)
            {
                perror("recv");
                exit(1);
            }
        }

        buffer[recv_size] = '\0';
        printf("FROM SERVER: %s\n", buffer);
    }

    close(sockfd);

    return 0;

service.js:

        app.get('/serverSearch', function (req, res) {
            var searchTxt = req.query.searchTxt;
            dirDirectory.readDirectory(function(logFiles){
                // res.json(logFiles);
                if(logFiles){
                    searchFileService.readFile(searchTxt,logFiles,function(lines,err){
                                console.log('Logs',lines);
                                  if (err)
                                   return res.send();
                                   res.json(lines);
                            })
                }
            });
            console.log('Search text', searchTxt);
        });

错误:

  

_http_outgoing.js:344

     

抛出新错误(&#39;在发送后无法设置标头。&#39;);

     

^

     

错误:发送后无法设置标头。

1 个答案:

答案 0 :(得分:0)

您的callback函数被多次调用,因为它位于for循环内。

第一次运行时,它会发送一个响应。

第二次运行时,它会抛出错误(因为响应已经发送)

您需要重构代码,以便在fs.readFile的所有实例都已解决后才发送回复。

该问题的一般解决方案在问题中提出:Callback after all asynchronous forEach callbacks are completed