#node.js #angular #express
#node.js #angular #экспресс
Вопрос:
Я запускаю программы на Python через Node.js и отправьте запрос на сервер. После запуска программы Python я хочу вывести данные на стороне клиента. Python занимает много времени, но когда-нибудь данные будут удалены.
Через некоторое время я получаю следующее сообщение об ошибке в вашем браузере:
ПОЛУЧИТЬ http://localhost:4200/api/test net::ERR_EMPTY_RESPONSE core.js: ОШИБКА 1673 HttpErrorResponse {заголовки: HttpHeaders, статус: 0, statusText: «Неизвестная ошибка», 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 route.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 service.ts
callData() {
return this._http.get<any>(`${'/api/test'}`, {}).pipe(map((res: any) => {
return res;
}));
}
Ответ №1:
Я полагаю, что ваша проблема в этом блоке
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;;
}
Комментарии:
1. Потрясающе. Я просто добавляю async () вместо AsyncHandler. Кажется, это работает. Или почему я должен использовать AsyncHandler?
2. Это нормально, если это работает, вам не нужно
asyncHandler