2015-06-28 3 views
1

Что я пытаюсь сделать: Подключите мой mongolab db к моему ионному приложению. (Я бы использовал Firebase, но Firebase не имеет текстового поиска, который мне нужен).Ошибка API POST: приложение MongoDB & Ionic

Я привел пример (https://scotch.io/tutorials/creating-a-single-page-todo-app-with-node-and-angular) для получения некоторого руководства.

Однако я получаю сообщение об ошибке:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8100/api/todos

Структура моих файлов: -project

+-www 
+---js 
------app.js 
------server.js 
------cordova.js 
+-----controllers 
+---css 
+---img 
+---lib 
+---templates 

Я знаю, что я, вероятно, отсутствует нечто фундаментальное. Я не понимаю, как мой server.js даже загружен ионным?

Вот фрагмент (только соответствующие части) моего server.js

// set up ======================== 
var express = require('express'); 
var app  = express();        // create our app w/ express 
var mongoose = require('mongoose');      // mongoose for mongodb 
var morgan = require('morgan');    // log requests to the console (express4) 
var bodyParser = require('body-parser'); // pull information from HTML POST (express4) 
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4) 
var uriUtil = require('mongodb-uri'); 

// configuration ================= 

var mongodbUri = 'mongodb://<myusername>:<mypass>@ds036648.mongolab.com:36648/<mydb>'; 
var mongooseUri = uriUtil.formatMongoose(mongodbUri); 
mongoose.connect(mongooseUri);  // connect to mongoDB database on modulus.io 

// listen (start app with node server.js) ====================================== 
app.listen(8100); 
console.log("App listening on port 8100"); 

// define model ================= 
var Todo = mongoose.model('Todo', { 
    text : String 
}); 

// create todo and send back all todos after creation 
app.post('/api/todos', function(req, res) { 

    // create a todo, information comes from AJAX request from Angular 
    Todo.create({ 
     text : req.body.text, 
     done : false 
    }, function(err, todo) { 
     if (err) 
      res.send(err); 

     // get and return all the todos after you create another 
     Todo.find(function(err, todos) { 
      if (err) 
       res.send(err) 
      res.json(todos); 
     }); 
    }); 

}); 

HTML, я использую:

<!-- FORM TO CREATE TODOS --> 
     <div id="todo-form" class="row"> 
      <div class="col-sm-8 col-sm-offset-2 text-center"> 
       <form> 
        <div class="form-group"> 

         <!-- BIND THIS VALUE TO formData.text IN ANGULAR --> 
         <input type="text" class="form-control input-lg text-center" placeholder="I want to buy a puppy that will love me forever" ng-model="formData.text"> 
        </div> 

        <!-- createToDo() WILL CREATE NEW TODOS --> 
        <button type="submit" class="btn btn-primary btn-lg" ng-click="createTodo()">Add</button> 
       </form> 
      </div> 
     </div> 

мой контроллер:

angular.module('starter') 
.controller('todosController', function($scope,$http) { 

    $scope.formData = {}; 
    // when submitting the add form, send the text to the node API 
    $scope.createTodo = function() { 
     $http.post('/api/todos', $scope.formData) 
      .success(function(data) { 
       $scope.formData = {}; // clear the form so our user is ready to enter another 
       $scope.todos = data; 
       console.log(data); 
      }) 
      .error(function(data) { 
       console.log('Error: ' + data); 
      }); 
    }; 
+0

вы ионный сервер и сервер API должен быть 2 Дифференцем серверах, эта строка $ http.post ('/ api/todos', $ scope.formData) кажется странной, поскольку вы должны запросить другой сервер – ThomasP1988

+0

, также вы используете server.js на узле справа или что-то подобное? –

ответ

2

It выглядит следующим образом:

$http.post('/api/todos', $scope.formData) 

Она должна указывать на сервер: поэтому оно должно быть что-то вроде этого:

$http.post('https://localhost:8100/api/todos', $scope.formData) 
+0

спасибо за отличный anwser, но как насчет того, когда я развертываю свое приложение на сервере, тогда снова мне нужно изменить путь от localhost: 8100 до mywebsitename в каждом файле? –

+0

Он должен указывать на ваш путь api. Поэтому, если вы запускаете свой сервер локально для тестирования, это будет как указано выше. Если нет, то он должен указывать на ваш сервер. Так что да, вам придется изменить его. –

0

Во-первых, вам нужно запустить сервер узла на другой порт, чем 8100, как ионную использует 8100 порт. Написать

app.listen(3000); 

вместо

app.listen(8100); 

Теперь для использования запроса апи это

$http.post('http://localhost:3000/api/todos', $scope.formData) 

Но на этот раз вы получите сообщение об ошибке

no 'access-control-allow-origin' header is present on the requested resource.

Это происходит потому, что браузер блокирует его, поскольку он у допускает запрос в том же происхождении для обеспечения безопасности reasons.So решения открыть хром, отключив безопасность, используя следующую команду в окне выполнения

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security 
Смежные вопросы