JSON中意外的令牌U在位置0

时间:2019-04-09 10:48:17

标签: node.js json angular mean-stack

我的MEAN Stack有问题。

我有一个具有良好价值的Angular Form,可以在后端使用Node Express创建公司ID DB。我有一个错误,指出节点中的JSON未定义。但我不明白为什么?

app.js

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const userboRoutes = require('./routes/userbo');
const companyRoutes = require('./routes/company');
const path = require('path');

mongoose.connect('mongodb://127.0.0.1/aya', {useNewUrlParser: true})
  .then(() => {
    console.log('Successfully connected to MongoDB AYA!');
  })
  .catch((error) => {
    console.log('Unable to connect to MongoDB! AYA');
    console.error(error);
  });

const app = express();

app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
    next();
  });
app.use(bodyParser.json());

app.use('/api/company', companyRoutes);
app.use('/api/authbo', userboRoutes);
module.exports = app;

routes \ company.js

const express = require('express');
const router = express.Router();
const companyCtrl = require('../controllers/company');
const Company = require('../models/company');

router.post('/', companyCtrl.createCompany);
router.get('/:id', companyCtrl.getOneCompany);
router.put('/:id',  companyCtrl.modifyCompany);
router.delete('/:id', companyCtrl.deleteCompany);
router.get('/',  companyCtrl.getAllCompany);

module.exports = router;

controller \ company.js

const Company = require('../models/company');
const fs = require('fs');

exports.createCompany = (req, res, next) => {


    req.body.company = JSON.parse(req.body.company);

    const company = new Company({
        coid:req.body.company.coid,
        coname: req.body.company.coname,
        service: req.body.company.service,
        address: req.body.company.address,
        state: req.body.company.state,
        zip: req.body.company.zip,
        city: req.body.company.city,
        country: req.body.company.country,
        size: req.body.company.size,
        domain: req.body.company.domain,
        duns: req.body.company.duns,
        tid1: req.body.company.tid1,
        numid1: req.body.company.numid1,
        tid2: req.body.company.tid2,
        numid2: req.body.company.numid2,
        tid3: req.body.company.tid3,
        numid3: req.body.company.numid3,
        bankname: req.body.company.bankname,
        bicswift: req.body.company.bicswift,
        iban: req.body.company.iban,
        datecreat: req.body.company.datecreat,
        bogid: req.body.company.bogid
    });

    company.save().then(
        () => {
            res.status(201).json({
                message: 'Post saved successfully!'
            });
        }
    ).catch(
        (error) => {
            res.status(400).json({
                error: error
            });
        }
    );

};

角度组件:

this.companyService.CreateCoData(company).then(
      () => {
        this.CreateCoForm.reset();
        this.router.navigate(['home']);
      },
      (error)=> {
        this.loading = false;
        this.errorMessage = error.message;
      }
    );

公司服务

import { Router } from '@angular/router';
import { Company } from './../models/company.model';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

export class CompanyService {

  constructor(private router: Router,
    private http: HttpClient) {  }
  company: Company[];
  companySubject = new Subject<Company[]>();
  public company$ = new Subject<Company[]>();

CreateCoData(company: Company) {
    return new Promise((resolve, reject) => {
      this.http.post('http://localhost:3000/api/company', company).subscribe(
        (response) => {
          resolve(response);
        },
        (error) => {
          reject(error);
        }
      );
    });
  }

我收到此错误:

SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)
    at exports.createCompany (E:\MEAN\BACKEND\controllers\company.js:7:29)

或者在请求有效负载(Chrome开发工具网络)中,json是正确的。 Request Payload 我不明白为什么req json处于未定义状态?

请帮助我了解:)

更新 只需使用POSTMAN即可: POSTMAN

并像这样更新company.js

exports.createCompany = (req, res, next) => {

   console.log( req.body);
  //  req.body.company = JSON.parse(req.body.company);

    const company = new Company({
        coid:req.body.coid,
        coname: req.body.coname,
        service: req.body.service,
        address: req.body.address,
        state: req.body.state,
        zip: req.body.zip,
        city: req.body.city,
        country: req.body.country,
        size: req.body.size,
        domain: req.body.domain,
        duns: req.body.duns,
        tid1: req.body.tid1,
        numid1: req.body.numid1,
        tid2: req.body.tid2,
        numid2: req.body.numid2,
        tid3: req.body.tid3,
        numid3: req.body.numid3,
        bankname: req.body.bankname,
        bicswift: req.body.bicswift,
        iban: req.body.iban,
        datecreat: req.body.datecreat,
        bogid: req.body.bogid
    });

    company.save().then(
        () => {
            res.status(201).json({
                message: 'Post saved successfully!'
            });
        }
    ).catch(
        (error) => {
            res.status(400).json({
                error: error
            });
        }
    );

};

我认为问题出在错误的数据格式上。但是如何正确设置呢?

2 个答案:

答案 0 :(得分:0)

.save函数返回一个回调和not a promise

因此,如果您按如下所示修改请求处理程序,它将起作用:

const Company = require('../models/company');
const fs = require('fs');

exports.createCompany = (req, res, next) => {


    req.body.company = JSON.parse(req.body.company);

    const company = new Company({
        coid:req.body.company.coid,
        coname: req.body.company.coname,
        service: req.body.company.service,
        address: req.body.company.address,
        state: req.body.company.state,
        zip: req.body.company.zip,
        city: req.body.company.city,
        country: req.body.company.country,
        size: req.body.company.size,
        domain: req.body.company.domain,
        duns: req.body.company.duns,
        tid1: req.body.company.tid1,
        numid1: req.body.company.numid1,
        tid2: req.body.company.tid2,
        numid2: req.body.company.numid2,
        tid3: req.body.company.tid3,
        numid3: req.body.company.numid3,
        bankname: req.body.company.bankname,
        bicswift: req.body.company.bicswift,
        iban: req.body.company.iban,
        datecreat: req.body.company.datecreat,
        bogid: req.body.company.bogid
    });

    company.save(function (err, newCompany) {
        if (err) {
            return res.status(400).json({ error: error });
        }

        return res.status(201).json(newCompany);
    });
};

答案 1 :(得分:0)

所以我找到了解决方案^^ 感到骄傲的**((^ o ^)/)**

第一篇文章中的更新之后,我发现问题出在内容类型错误上。

因此在**公司服务**(角度)中,我将其添加到了JSON强制类型!

import { HttpClient, HttpClientModule,** HttpHeaders** } from '@angular/common/http';
httpOptions = {
    headers: new HttpHeaders({
      'Content-Type':  'application/json',

    })
  };
CreateCoData(company: Company) {
    return new Promise((resolve, reject) => {
      this.http.post('http://localhost:3000/api/company', company, **this.httpOptions**).subscribe(
        (response) => {
          resolve(response);
        },
        (error) => {
          reject(error);
        }
      );
    });
  }

enter image description here