【问题标题】:"Can't set headers after they are sent." error in node when getting data via angular“发送后无法设置标题。”通过角度获取数据时节点出错
【发布时间】:2018-07-06 10:37:00
【问题描述】:

我正在使用 Angular 6,我希望在页面加载后立即填写一个表单,它永远不会为空,并且可以随时提交。

在我的表单中,我有一个双向绑定

first name <input type="text" id="firstname" [(ngModel)]="firstname" name="firstname" >

在我拥有的组件中

  ngOnInit() {
    this.profileService.getProfile(this.user_id).subscribe((data) =>{
      if(data.success){
        this.firstname = data.firstname;
    })
  }

所以,一旦页面加载,我正在填写表单,并且由于双向绑定,表单永远不会为空(除非用户故意删除所有内容,在这种情况下,角度检查空字段并且不会提交。 )。因此,用户可以随时提交。

在服务中,getProfile函数是

  createAuthorizationHeader(headers: Headers) {
    headers.append('Authorization', this.token);
    headers.append('Content-Type','application/json');
  }

  getProfile(user_id){
    let headers = new Headers();
    this.createAuthorizationHeader(headers);
    return this.http.get('http://localhost:3000/profile/'+user_id, {headers:headers}).pipe(map(res => res.json()));
  }

我的问题是 node.js 每次刷新时都会在控制台中显示Error: Can't set headers after they are sent.

这是因为我的代码和随时提交的能力吗?我怎样才能解决这个问题?我应该能够设置一次相同的标题并在以后的每次getProfile 调用中使用它们。我尝试了类似

  createAuthorizationHeader(headers: Headers) {
    headers.append('Authorization', this.token);
    headers.append('Content-Type','application/json');
  }
    let headers = new Headers();
    this.createAuthorizationHeader(headers);

  getProfile(user_id){
    return this.http.get('http://localhost:3000/profile/'+user_id, {headers:headers}).pipe(map(res => res.json()));
  }

然后 angular 说'return' outside of function 关于getProfile

这里有什么帮助吗?

谢谢

编辑

从节点点出发,这是我用角度击中的路线

router.get('/:userid', validate.required(), (req, res)=>{ 
  user.query('select firstname from user WHERE id = $1', [req.params.userid])
  .then((resolved)=>{
      res.json({success:true, data:data });    
   })
   .catch((error)=>{
     res.json({success:false, msg:errorvalue});
   });
});

这是validate 中间件

  exports.required = ()=>{
    return (req, res,next)=>{
      const token = req.get('Authorization');
      const key = config.key;
      jwt.verify(token, key,function(err, decoded) {
        if (err){res.json({redirect:true});}
        if (decoded){
          let dateNow = Math.floor(Date.now() / 1000);
          if (dateNow > decoded.exp){res.json({redirect:true});}
          next();
        }
        else {res.json({redirect:true});}
      });
    }
  }

【问题讨论】:

  • 如果您遇到 NodeJS 错误,那么这不是 Angular 错误。你的 API 使用 NodeJS 吗?
  • 帮助不大? - 不要使用 Angular 应用程序来调试后端问题。这提供了不必要的移动部件。如果是 Node 问题(很可能是),请提出特定于 Node 的问题并提供 stackoverflow.com/help/mcve 。您应该能够通过常规 Postman 请求复制问题,减去整个 Angular 内容。
  • 是的,我正在访问我创建的节点 API。我应该发布什么节点代码?此路由受特定于路由的中间件保护,该中间件检查标头中的令牌

标签: node.js angular http-headers


【解决方案1】:

就像错误所说:您正在设置标头,但服务器已经发送了响应。您需要在调用链中更早地设置标头。

如果您想要一个示例,请查看我的仓库:

https://github.com/Robbie106gti/nc-catalog/blob/master/functions/auth/login.js

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多