Angular2 пустое тело ответа docx пусто

Я использую Angular2 для загрузки сгенерированного файла.docx с моего экспресс-сервера. Файл генерируется инструментом и сохраняется на сервере, а затем отправляется на веб-интерфейс.

В журнале моего браузера указано, что длина результата больше 0, но отправляемый BLOB-объект не имеет тела, поэтому фактическое содержимое документа не может быть найдено.

Я следовал нескольким примерам и учебникам, особенно этому, но пока никакого результата. Что я делаю неправильно?

экспресс-бэкэнд:

generate(req: express.Request, res: express.Response): void {
    try {
        var docxGenerator = new DocxGenerator();
        docxGenerator.generate((error, filename) => {
            if (error) res.send(error);
            if (filename) { 
                res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
                res.setHeader('Content-disposition', 'attachment; filename=GeneratedFile.docx');
                var file = fs.readFileSync(filename);
                res.end(file);
            }
        });
    } catch (error) {
        res.send(error);
    }
}

Angular2 Сервис:

export class DocxTemplaterService {

// declarations left out for brevity

constructor(
    private http: Http,
    private authService: AuthenticationService
) {
    this.headers = new Headers({'Content-Type': 'application/json'});
    this.headers.append('Authorization', 'Bearer ' + this.authService.token());
    this.options = new RequestOptions({ headers: this.headers });
}

generateDocx(): Observable<any> {
    this.options.responseType = ResponseContentType.Blob;
    return this.http
        .post(this.docxUtilUrl + '/create', JSON.stringify(module), this.options)
        .map(response => {
            console.dir(response);
            response.blob();
        })
        .catch(this.handleError);
}

private handleError(error: any) {
    return Promise.reject(error.message || error);
}
}

Angular2 Компонент:

generateDocx(module: Module) {
   this.docxTemplateService
       .generateDocx()
       .subscribe(
            data => {
                console.log(`Word data: ${data}`);
                if (data !== undefined) 
                    // save file somehow
                else console.log('No file to download.');
            },
            error => { this.alertService.error(error); },
            () => this.alertService.success("Success", true)
        );
}

Содержимое Blob зарегистрировано в консоли Chrome:

size: 68192
type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
__proto__: Blob

Итак... размер без содержимого. Помощь приветствуется!

1 ответ

Решение

Вы должны явно вернуть response.blob от function как вы использовали скобки в функции стрелки.

generateDocx(): Observable<any> {
    this.options.responseType = ResponseContentType.Blob;
    return this.http
        .post(this.docxUtilUrl + '/create', JSON.stringify(module), this.options)
        .map(response => {
            console.dir(response);
            return response.blob(); //need to return response blob
        })
        .catch(this.handleError);
}

Или, скорее, вы можете сделать это map функция одного лайнера

.map(response => response.blob())

Подобный ответ здесь

Другие вопросы по тегам