当前位置: 首页 > 知识库问答 >
问题:

angular2,将表单发布到后端restful错误:JSON输入意外结束

唐永春
2023-03-14

我得到了这个错误:

accounts.service.ts?29fe: 45语法错误:JSON输入的意外结束。好像服务器不喜欢json格式

当我使用邮递员发送与x-www-form_urlencoded两个字段:lastname和firstname工作良好。

我不太明白转换,我必须做正确的工作与后端,有后端与x-www-form_urlencoded和另一个与完整的json?因为大多数教程不使用任何类型的转换来从表单发送帖子数据。我见过一些使用新URLSearchParams()的解决方案;但是在angular2中没有自动转换?

从我的服务器日志中,当我与邮递员一起发送邮件时,我得到:

add: {"lastname":"mylast","firstname":"myfirst"}

但通过angular2组件,我得到:

add: {}

数据还没到

我有这个部分:

import {Component, Input, OnInit} from '@angular/core';
import {AccountsService} from '../shared/index';


@Component({
    selector: 'app-accounts-form',
    templateUrl: 'accounts-form.component.html',
    styles: [require('./accounts-form.component.scss')],
    providers: [AccountsService]

})
export class AccountsFormComponent implements OnInit {
    @Input() accountId: string = '';
    public account: any =       {
        firstname: '',
        lastname: ''
    };

    constructor(private accountsService: AccountsService    ) {
    }

    ngOnInit() {

        if (this.accountId !='' ) {
            this.getById();
        }
    }

    onSubmit() {
        if (this.accountId =='' ) {
            console.log('submit new');
            this.accountsService
                .insert(this.account)
                .subscribe((data) => {
                        console.log(data);
                        this.account = data
                    },
                    error => console.log(this.account),
                    () => console.log('Insert complete'));

        } else {
            console.log('submit update '+this.accountId);
        }

    }


    private getById(): void {

        this.accountsService
            .getById(this.accountId)
            .subscribe((data) => {
                    console.log(data);
                    this.account = data
                },
                error => console.log(this.account),
                () => console.log('Get Item complete'));


    }

}

模板:

<form (ngSubmit)="onSubmit()">
<div class="form-group">
  <label for="lastname">Last Name</label>
  <input [(ngModel)]="account.lastname"  name="lastname"/>
</div>
<div class="form-group">
  <label for="firstname">First Name</label>
  <input [(ngModel)]="account.firstname"  name="firstname"/>
</div>
<div>
  <button type="submit" class="btn btn-default"
          >Submit</button>
</div>
</form>

服务:

import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map'
import { Observable } from 'rxjs';
import { Configuration } from '../../app.constants';

@Injectable()
export class AccountsService {
  private actionUrl: string;
  private headers: Headers;

  constructor(private http: Http, private configuration: Configuration) {

      this.actionUrl = configuration.ServerWithApiUrl + 'accounts';

      this.headers = new Headers();
      this.headers.append('Content-Type', 'application/json');
            this.headers.append('Accept', 'application/json');
  }


    public insert(body: any): Observable<any> {
        console.log( 'insert url:'+ this.actionUrl  );
        console.log(JSON.stringify( body))
        return this.http.post(this.actionUrl , JSON.stringify( body),  { headers: this.headers })
            .map((response: Response) =>  response.json())
            .catch(this.handleError);
    }

  private handleError(error: Response) {
      console.error(error);
      return Observable.throw(error.json().error || 'Server error');
  }

}

我的后端服务器与mongo和快速4:

const insert = function (req, res) {
    data = req.body;
    console.log('add: ' + JSON.stringify(data));
    objectDb.insertOne(data, function (err, result) {
        if (err) {
            res.send({'error': 'An error has occurred'});
        } else {
            res.send(result[0]);
        }
    });

};

我已经在我的服务上尝试过,不使用表单值,而是使用硬编码值

>

把这个还给我。http。post(this.actionUrl,'firstname

尝试用json发送数据

return this.http.post(this.actionUrl ,  {'firstname':'test1','lastname':'test2'},  { headers: this.headers })
    .map((response: Response) =>  response)
    .catch(this.handleError);

两个方法都不起作用

更新:

我已将insert()更改为我的服务:

.map((response: Response) =>  response.json()) <-- removed .json() here;

不再出现错误:“意外的JSON输入结束”只是数据没有发送到服务器。

我已更新以获取响应日志:

.map((response: Response) => console.log(response))

然后我得到了新的错误:

core.umd.js?e2a5:2837 EXCEPTION: Error in ./AccountsFormComponent class AccountsFormComponent - inline template:3:9 caused by: Cannot read property 'lastname' of undefinedErrorHandler.handleError

服务代码中实际更新的insert()函数:

public insert(body: any): Observable<any> {
    console.log( 'insert url:'+ this.actionUrl  );
    console.log(JSON.stringify( body))
    return this.http.post(this.actionUrl ,  {'firstname':'test1','lastname':'test2'},  { headers: this.headers })
        .map((response: Response) => console.log(response))
        .catch(this.handleError);
}

在开发工具xhr选项卡上,我得到:

Request URL:http://localhost:3000/accounts
Request Method:POST
Status Code:200 OK
Remote Address:[::1]:3000
Response Headers
view source
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:0
Date:Thu, 01 Dec 2016 14:21:04 GMT
X-Powered-By:Express
Request Headers
view source
Accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2
Connection:keep-alive
Content-Length:40
Content-Type:application/json
Host:localhost:3000
Origin:http://localhost:8080
Referer:http://localhost:8080/accounts-add
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Request Payload
view source
{firstname: "test1", lastname: "test2"}
firstname
:
"test1"
lastname
:
"test2"

共有1个答案

许彭祖
2023-03-14

你正试图将你的身体发布为'应用/json'...

所以不要JSON. stringify()你的身体。

 类似资料:
  • 我试图使用下面的代码从一个api网站获取一个JSON文件,但是当我使用下面的代码获取时,我得到一个错误,说“JSON输入意外结束”

  • 问题内容: 我得到了以下代码 请注意,我对数据值进行了硬编码。数据被很好地推送到数据库中。但是,我不断收到错误“解析错误语法错误,输入意外结束”。我确定我的数据使用正确的JSON语法。当我在Chrome检查器的网络上进行检查时,saveProduct请求显示数据正确。 此POST请求没有响应。因此,我对于解析错误的来源一无所知。我尝试使用FireFox浏览器。同样的事情发生了。 任何人都可以对什么

  • 我正在尝试在Go API服务器和基于React的前端之间发送JSON。我得到以下错误: 错误:SyntaxError:JSON输入意外结束 它说这发生在第25行,这是 这是相关的函数: 在尝试了一些故障排除之后,我将错误捕捉添加到带有“成功”和“错误”输出的函数中,这样它至少可以停止弹出错误页面,并在API服务器上添加一些控制台输出,以查看数据是否正在传递。 除了出现错误之外,一切似乎都在按预期运

  • 问题内容: 我正在研究一些代码来解析来自HTTP响应的JSON数据。我的代码看起来像这样: 变量中的json 如下所示: 但是,不是零。当我打印出来时,上面写着。是什么原因造成的?JSON似乎有效。此错误与我的自定义结构有关吗? 提前致谢! 问题答案: 所述的结果是一个语法错误在JSON输入(可能丢失,或)。该错误不取决于您解码到的值的类型。 我在操场上使用示例JSON输入运行了代码。它运行没有错

  • 我得到了的意外结束。代码对我来说很好,我错过了什么? 安慰:

  • 问题内容: 我有一个如下所示的Web API控制器: 这是正确的语法,但是当我尝试从Angular 2的服务中调用它时,出现错误消息:“ json解析错误语法错误输入意外结束”。要解决此问题,我必须在ActionResult中输入一个值,例如 我是否缺少某些配置?我的Angular 2服务电话如下所示: 问题答案: 我猜想,当您收到一个空响应(没有有效负载)时,您无需调用该方法。在后台,XHR响应