node.js - http请求后浏览器显示err_empty_response

标签 node.js angular express

我通过 Node.js 启动 Python 程序并向服务器发送请求。 Python程序运行后,我想在客户端输出数据。 Python 需要很长时间,但有时它会输出数据。

一段时间后,我在您的浏览器中收到以下错误消息:

GET http://localhost:4200/api/test net::ERR_EMPTY_RESPONSE core.js:1673 ERROR HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}

但是我的 Python 程序通过了。

我尝试使用 res.end()、res.send(200).json() 和 res.send(),但遇到了同样的问题

server.ts

import app from './app';
import { Database } from './database';

const PORT = 8000;

Database.connect();

app.listen(PORT, () => {
  console.log('Express server listening on port ' + PORT);
});

app.timeout = 12000000000;

Node.js 路由.ts

app.route('/api/test').get((req: Request, res: Response) => {
  const spawn = require('child_process').spawn;
  const ls = spawn('python', [__dirname + '/getPosts.py']);
  let inData;
  ls.stdout.on('data', (chunk) => {
    inData = chunk.toString().replace('\n', '').split(',');
  });

  ls.stderr.on('data', (chunk) => {
    console.log(`stderr: ${chunk}`);
  });

  ls.on('close', (code) => {
    res.json(inData[0]); // -> ['True']
  });
});

Angular 服务.ts

  callData() {
    return this._http.get<any>(`${'/api/test'}`, {}).pipe(map((res: any) => {
      return res;
    }));
  }

最佳答案

我相信你的问题在这个区 block

app.route('/api/test').get((req: Request, res: Response, next: any) => {

        |
        |
        |
        |
       \ /
        .

  (1)     // you receive request from front-end.
  (2)     // then excute your paython script/

      const spawn = require('child_process').spawn;
      const ls = spawn('python', [__dirname + '/getPosts.py']);
      let inData;

      // start listning to events for stdout. 

      ls.stdout.on('data', (chunk) => {
        inData = chunk.toString().replace('\n', '').split(',');
      });

      ls.stderr.on('data', (chunk) => {
        console.log(`stderr: ${chunk}`);
      });

      ls.on('close', (code) => {
        res.json(inData[0]); // -> ['True']

        (6) I got data here. send it as json
        (7) Huh!!! where is the connection.

      });


   (3)    // your callback is waiting you to responed
   (4)    // nothing happen 
   (5)    // connection closed.

});




             FIX
// npm install --save express-async-handler
// of use this
const asyncUtil = fn =>
function asyncUtilWrap(...args) {
  const fnReturn = fn(...args)
  const next = args[args.length-1]
  return Promise.resolve(fnReturn).catch(next)
}


  app.route('/api/test', asyncHandler(async (req, res, next) => {
    const inData = await processMydata();
    res.json(inData[0])
})) 

async processMydata(){
      const spawn = require('child_process').spawn;
      const ls = spawn('python', [__dirname + '/getPosts.py']);
      const promise  =  new Promise(function(resolve, reject){
        ls.stdout.on('data', (chunk) => {
          const inData = chunk.toString().replace('\n', '').split(',');
          resolve(inData)
        });
      }) 
    return await promise;;
}

关于node.js - http请求后浏览器显示err_empty_response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524038/

相关文章:

javascript - 无法从 Angular 路由器获取路径或网址

node.js - 使用 Windows 10 使用 nodemon 进行 Docker 热重载 Node 应用程序

javascript - 如何等到回调完全完成?

javascript - 处理 JWT 过期和 JWT 有效负载更新

javascript - Node.js - 从 JSON 对象中删除空元素

javascript - 上传多个文件时出现异步问题

node.js - Nodejs中的简单代理服务

node.js - 在 Express 服务的多个 React 客户端内进行路由

angular - 即使在调用 map.invalidateSize() 之后,传单 map 也无法在模式中正确渲染

Angular CLI : Proxy websocket with proxy. conf.json