javascript - Angular 2 : EXCEPTION: Unexpected token < in JSON at position 0

标签 javascript json angular

我正在尝试在我的 Angular 2 代码中实现 REST API,但我在通过 Angular 从 Express 获取数据时遇到问题

当我删除 Angular 组件时,没有错误,所以很可能是它导致了问题。我还可以通过服务器路由http://localhost:3001/task访问数据,因此数据是通过express接收的

这是我的server.js

        'use strict';
const express = require('express');
const app = express();
const jwt = require('express-jwt');
const cors = require('cors');
const bodyParser = require('body-parser');
const multer = require('multer');
const path = require('path');

var tasks = require('./routes/tasks');

var router = express.Router();
var mongojs = require('mongojs');

app.use('/tasks', tasks);



// Set Static Folder
app.use(express.static(path.join(__dirname, 'client')));


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());


const authCheck = jwt({
  secret: new Buffer('0u33qUTwmPD-MFf56yqJ2DeHuQncgEeR790T3Ke1TX3R5R5sylVfUNlHWyqQS4Al', 'base64'),
  audience: 'PBNaD26w0HdAinA5QFSyABjWZNrZSx9M'
});




const upload = multer({
  dest: 'uploads/',
  storage: multer.diskStorage({
    filename: (req, file, cb) => {
      let ext = path.extname(file.originalname);
      cb(null, `${Math.random().toString(36).substring(7)}${ext}`);
    }
  })
});

app.post('/upload', upload.any(), (req, res) => {
  res.json(req.files.map(file => {
    let ext = path.extname(file.originalname);
    return {
      originalName: file.originalname,
      filename: file.filename
    }
  }));
});

app.get('/api/deals/public', (req, res)=>{
  let deals = [
  {
    id: 12231,
    name: 'Playstation 4 500GB Console',
    description: 'The Playstation 4 is the next gen console to own. With the best games and online experience.',
    originalPrice: 399.99,
    salePrice: 299.99
  },
  {
    id: 12234,
    name: 'Galaxy Note 7',
    description: 'The Note 7 has been fixed and will no longer explode. Get it an amazing price!',
    originalPrice: 899.99,
    salePrice: 499.99
  },
  {
    id: 12245,
    name: 'Macbook Pro 2016',
    description: 'The Macbook Pro is the de-facto standard for best in breed mobile computing.',
    originalPrice: 2199.99,
    salePrice: 1999.99
  },
  {
    id: 12267,
    name: 'Amazon Echo',
    description: 'Turn your home into a smart home with Amazon Echo. Just say the word and Echo will do it.',
    originalPrice: 179.99,
    salePrice: 129.99
  },
  {
    id: 12288,
    name: 'Nest Outdoor Camera',
    description: 'The Nest Outdoor camera records and keeps track of events outside your home 24/7.',
    originalPrice: 199.99,
    salePrice: 149.99
  },
  {
    id: 12290,
    name: 'GoPro 4',
    description: 'Record yourself in first person 24/7 with the GoPro 4. Show everyone how exciting your life is.',
    originalPrice: 299.99,
    salePrice: 199.99
  },
  ];
  res.json(deals);
})

app.get('/api/deals/private', authCheck, (req,res)=>{
  let deals = [
  {
    id: 14423,
    name: 'Tesla S',
    description: 'Ride in style and say goodbye to paying for gas. The Tesla S is the car of the future.',
    originalPrice: 90000.00,
    salePrice: 75000.00
  },
  {
    id: 14553,
    name: 'DJI Phantom 4',
    description: 'The Drone revolution is here. Take to the skies with the DJI Phantom 4.',
    originalPrice: 1299.99,
    salePrice: 749.99
  },
  {
    id: 15900,
    name: 'iPhone 7 - Jet Black',
    description: 'Get the latest and greatest iPhone in the limited edition jet black.',
    originalPrice: 899.99,
    salePrice: 799.99
  },
  {
    id: 16000,
    name: '70" Samsung 4K HDR TV',
    description: 'Watch as if you were there with the latest innovations including 4K and HDR.',
    originalPrice: 2999.99,
    salePrice: 2499.99
  },
  {
    id: 17423,
    name: 'Canon t8i DSLR',
    description: 'Capture life\'s moments with the amazing Canon t8i DSLR',
    originalPrice: 999.99,
    salePrice: 549.99
  },
  {
    id: 17423,
    name: 'Xbox One S',
    description: 'Get the latest Xbox and play the best first party games including Gears of War and Forza.',
    originalPrice: 299.99,
    salePrice: 279.99
  },
  ];
  res.json(deals);
})


app.listen(3001);
console.log('Listening on localhost:3001');

任务.js

var express = require('express');
var router = express.Router();
var mongojs = require('mongojs');
var db = mongojs('mongodb://mojtaba:123456@ds129038.mlab.com:29038/mytasklist_mojtaba', ['tasks']);

// Get All Tasks
router.get('/tasks', function(req, res, next){
    db.tasks.find(function(err, tasks){
        if(err){
            res.send(err);
        }
        res.json(tasks);
    });
});

module.exports = router;

Angular 2

任务.组件.ts:

    import { Component } from '@angular/core';
    import {TaskService} from './task.service';
    import {Task} from '../../Task';


    @Component({
      selector: 'tasks-component',
      templateUrl: 'tasks.component.html'
    })

    export class TasksComponent {
      tasks: Task[];
      title: string;

      constructor(private taskService:TaskService){
        this.taskService.getTasks()
          .subscribe(tasks => {
            this.tasks = tasks;
          });
      }

      addTask(event){
        event.preventDefault();
        var newTask = {
          title: this.title,
          isDone: false
        }

        this.taskService.addTask(newTask)
          .subscribe(task => {
            this.tasks.push(task);
            this.title = '';
          });
      }
    }
}

任务.service.ts:

import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';
import 'rxjs/add/operator/map';


@Injectable()
export class TaskService{


  constructor(private http:Http){
    console.log('Task Service Initialized...');
  }
  /*
   getTasks(){
   console.log('get tasks works');
   return this.http.get('/tasks')
   .map(res => res.json());
   }

   */
  getTasks(){
    return this.http.get('/tasks')
      .map(res => res.json());
  }
}

错误 enter image description here

我尝试将 JSON 而不是 html 发送到客户端,但它不起作用。所以我该怎么做?

最佳答案

此错误意味着您的 ajax 调用 ( http.get ) 正在访问 html 页面,然后您尝试将其解析为 JSON。

在你的express中,你有一个/task 的路线,但在你的服务中,你试图访问/api/task ,我认为它不存在。

因此您需要更改 express api 或更改您的 http.get 方法。

所以要么:

app.get('/api/tasks', (req, res)=>{
    db.tasks.find(function(err, tasks){
        if(err){
            res.send(err);
        }
        res.json(tasks);
    });
});

或者:

getTasks(){
    console.log('get tasks works');
    return this.http.get('/tasks')
      .map(res => res.json());
  }

在所有情况下,确保您使用正确的 api 的最佳方法是查看您的网络选项卡并查看您通过 AJAX 调用访问的 url,然后将其复制粘贴到您的浏览器中(或者更好, postman )看看有什么回应,

在你的情况下,我想你会看到: Can't get Route api/task ,这是由 Express 服务器抛出的。

关于javascript - Angular 2 : EXCEPTION: Unexpected token < in JSON at position 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41037834/

相关文章:

javascript - 使用带有 javascript 的 FourSquare API 访问 field 提示

javascript - 由于 ɵɵinject 和 ɵɵdefineInjectable(在编译时出现错误),无法运行 Angular 应用程序

html - 动态显示 "show more"

表单的 Javascript 函数不与文本内容一起显示

javascript - 第一次加载后,javascript load()方法会缓存资源吗?

jquery - 将 JSON 对象插入客户端 Web sql 数据库

json - sails .js : compression doesn’t seem to work on json

angular - Dart Angular 2 Transclusion 使用带有多个选择器的 ng-content

javascript - 从动态下拉列表中获取选定值(由 javascript 生成的 ID 选项)

javascript - 使用Javascript创建表(添加tableee)