#javascript #node.js #angular #typescript
#javascript #node.js #angular #typescript
Вопрос:
Я запускаю эту функцию под названием upload (), нажав на кнопку отправки во внешнем интерфейсе.
в моем app.html:
<div class="row" style="padding:10px;">
<button type="submit" class="btn btn-primary" style="margin-left:10px;" (click)="upload()">Submit</button>
</div>
в моем app.ts:
upload() {
this.files = {
pdf_one: './server/test-pdfs/pdf-sample.pdf',
pdf_two: './server/test-pdfs/pdf-sample.pdf',
};
this.filesToUpload = [];
this.filesToUpload.push(this.files.pdf_one);
this.filesToUpload.push(this.files.pdf_two);
this.getMergedPDF(this.filesToUpload);
}
getMergedPDF(filesToUpload): Observable<string> {
return this.http.post<string>('http://localhost:8081/merge-pdf', JSON.stringify(filesToUpload));
}
Я установил точки останова, и функция, описанная выше, вызывается просто отлично. Это просто, когда он попадает в node.js кроме того, ничего не запускается.
Вот как я устанавливаю конечную точку api на стороне nodejs: server.js
app.post('/merge-pdf', (req, res) => {
this.fileList = req;
PDFMerge(this.fileList, {output: `${__dirname}/test-pdfs/merged-pdf.pdf`});
res.send(200);
});
const server = app.listen(8081, () => {
console.log('Listening on port %s...', server.address().port);
});
Мне было интересно, что я мог делать неправильно выше, что конечная точка api не запускается?
Редактировать:
Я пробовал это:
getMergedPDF(filesToUpload): Observable<string> {
return this.http.post<string>('http://localhost:8081/merge-pdf', JSON.stringify(filesToUpload))
.subscribe(data => this.mergedUrl = data);
}
Но возникает эта ошибка:
Type 'Subscription' is not assignable to type 'Observable<string>'.
Property '_isScalar' is missing in type 'Subscription'.'
Комментарии:
1. Похоже, что вы на самом деле не подписываетесь на
Observable
возвращаемыйgetMergedPDF()
, что означает, что запрос POST никогда не будет выполнен.2. удалите этот наблюдаемый возвращаемый тип<string> из РЕДАКТИРОВАНИЯ, потому что вместо этого вы возвращаете подписку
3. @WilhelmOlejnik большое вам спасибо. В этом и была проблема!
Ответ №1:
Вам нужно подписаться на него. Наблюдаемые объекты являются ленивыми и фактически не будут выполнять вызов POST, если вы не подпишетесь на него.
this.http.post(...).subscribe(...)
Вы можете убедиться, что узел не неисправен, проверив вкладку Сети вашего браузера и увидев, что HTTP-вызов вообще не выполняется.
Комментарии:
1. Хорошо, я пытаюсь это: getMergedPDF(filesToUpload): Observable<строка> { верните this.http.post<строка>(‘ localhost:8081/merge-pdf ‘, JSON.stringify(filesToUpload)) .subscribe(this.mergedUrl => данные); } Но затем я получаю эту ошибку: ‘Аргумент типа ‘string’ не может быть присвоен параметру типа ‘(значение: строка) => void ‘.’
2. Нет,
.subscribe(data => this.mergedUrl = data)
, но это другая проблема. Выполняется ли сейчас HTTP-вызов? Если да, то этот вопрос решен3. можете ли вы проверить мою правку выше? Я все еще получаю ошибку при использовании .subscribe
4. Я получаю: ‘Свойство ‘map’ не существует для типа ‘Observable<string>’.’
5. Тогда я не знаю. Я всегда использую
.post(...).subscribe( data => ...... )
, и это работает во всех моих проектах.