【问题标题】:Angular 2 Post Request to Node/Express Server EndpointAngular 2 向 Node/Express 服务器端点发布请求
【发布时间】:2016-08-09 09:46:18
【问题描述】:

我似乎无法诊断为什么我无法在 Angular 2 Typescript 应用程序中发送成功的 HTTP 请求。我通过Postman成功发送POST请求,但是前端似乎对链接到后端不满意......没有错误,后端从来没有响应。请帮忙!

我在 C9 环境中工作。

这是我当前的实现:

import {Component} from 'angular2/core';
import {MessageBody} from '../message-body/message-body';
import {Http, HTTP_PROVIDERS, Headers} from 'angular2/http';

@Component({
  selector: 'signup',
  template: require('app/signup/signup.html'),
  styles: [require('app/signup/signup.css')],
  viewProviders: [HTTP_PROVIDERS],
  providers: []
})

export class Signup {
  model = new MessageBody(
    '',
    '',
    '',
    '');
  constructor(public http: Http) {
  }
  onSubmit() {
    var headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    this.http.post('/email', JSON.stringify(this.model), {headers: headers})
      .map(res => console.log(res.json()));
  }
}

这是服务器上的端点:

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.post('/email', sendEmail);

app.use(express.static(__dirname +'/../dist'));

app.listen(process.env.PORT, listen);

我试过发帖到/emailhttp://localhost:8080/emailhttps://{appName}-{username}.c9users.io/email,都无济于事!

我做错了什么?感谢您的帮助!

编辑:蒂埃里已经在这里回答了,所以这是一个骗局。 angular2: http post not executing

【问题讨论】:

  • 这与您的应用程序最初加载的 URL + 端口相同吗?
  • @GünterZöchbauer 是的

标签: node.js http express angular


【解决方案1】:

内容类型与您提供给 POST 方法的内容不匹配。

如果您希望使用 url 编码的形式,则需要以这种方式更新您的代码:

onSubmit() {
  var headers = new Headers();
  headers.append('Content-Type', 'application/x-www-form-urlencoded');

  var content = new URLSearchParams();
  content.set('somefield', this.model.somefield);
  (...)

  this.http.post('/email', content.toString(), {headers: headers})
  .map(res => console.log(res.json()));
}

如果要发送 JSON 内容,只需更改 Content-Type 标头的值即可:

onSubmit() {
  var headers = new Headers();
  headers.append('Content-Type', 'application/json');

  this.http.post('/email', JSON.stringify(this/model), {headers: headers})
  .map(res => console.log(res.json()));
}

此外,我认为您的端点不位于同一台机器上,除非您通过您的 Express 应用程序提供类似这样的服务:

app.use(express.static('public'));

【讨论】:

  • 感谢@thierry 的快速回复!只是为了澄清起见,如果我将“application/json”作为我的 Content-Type 发送,为什么我以前的实现不起作用?我也试过了。我现在正在尝试您的实施。我会及时通知你。
  • 不客气! “以前的实施”是什么意思?
  • 啊,您的编辑回答了我的问题。我本质上是在问,如果我将我的内容类型替换为“application/json”而不是我在上面使用的(“application/x-www-form-urlencoded”),它是否会起作用。不幸的是,你的建议都没有奏效......还有一些调试说明:我知道我正在点击 onSubmit 函数,因为我已经尝试在那里登录,并且 this.http.post 也是我期望的函数,但它看起来像我的后端从不通过应用程序接受 POST 请求。但它确实通过 Postman FYI 接受它,解决方案中有一个编辑: JSON.stringify(this.model)
  • 好的!您可以在开发工具的网络选项卡中看到您的请求吗?
  • 您可以尝试在bootstrap 函数中移动HTTP_PROVIDERS 吗?还是在组件的providers 属性中?
猜你喜欢
  • 2015-12-16
  • 2016-02-27
  • 2019-04-08
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多