NodeJS中String的串联问题:响应中发送的数据为空

Posted

技术标签:

【中文标题】NodeJS中String的串联问题:响应中发送的数据为空【英文标题】:Problem with concatenation of String in NodeJS: the data sent in the response is empty 【发布时间】:2020-07-11 22:52:39 【问题描述】:

此代码是附加数据并将其发送给客户端。但是数据没有被附加。请帮忙

app.post('/api/display', (req,res) => 
   let data = "";
   const bod = req.body;
   var input = fs.createReadStream('sample.txt');

   var r1 = require('readline').createInterface(
      input: input
   );

   r1.on('line', function(line) 
      var ar = line.split("=");
      var valuetypestring = ar[0].split(" ");
      var valuetype = valuetypestring[0];
      var valuestring = ar[1].split(" ");
      var value = valuestring[1];
      for(var attributename in bod)
         if(valuetype==attributename)
            //console.log is giving the output
            console.log(`$valuetype:$value new value:$bod[attributename]`); 
            //The data doesnt get appended
            data+=`$valuetype:$value new value:$bod[attributename]`; 
         
          
   );
   res.send(data); //Here the string is sent empty
);

【问题讨论】:

如果您在 res.send(data) 之前放置一个 console.log - 您可能会看到它在 data 被附加到之前触发,并且仍然等于 "" - 因为 fs.createReadStream 是异步的:见:***.com/questions/30386768/… 【参考方案1】:

Readline 与许多其他模块一样,是异步。这意味着它在等待数据时不会阻止代码的执行。因此,您开始侦听线路,但没有等待数据完成发送以便调用res.send(data)。你要做的是换行:

res.send(data);

r1.on("close", function() 
    res.send(data);
);

因此您知道数据已收到。然后,当您从控制台输入数据时,您可以按Ctrl+D 表示所有行都已发送。如果您只想接收一行,则无需等待close 事件,只需将res.send(data) 移动到行处理程序中即可。

【讨论】:

以上是关于NodeJS中String的串联问题:响应中发送的数据为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个异步调用中向 NodeJS 中的数据库发送响应?

在NodeJS中发送不同的POST响应

nodejs的http模块不是能够立即接收/发送整个请求/响应吗?

确认响应发送太晚; NodeJS Express 异步响应

如何在 express/node js 中发送错误 http 响应?

使用 Express.js 和 NodeJS,您可以在响应正文中通过重定向发送 JSON