2017-05-11 4 views
1

J'apprends à utiliser un backend alors pardonnez-moi si c'est élémentaire, il semble que je manque quelque chose de simple. J'essaie de créer une simple application CRUD pour apprendre, j'ai donc choisi de créer une plate-forme de blog que je peux incorporer dans mon site Web plus tard. J'utilise Angular, Node et Express, et PostgreSql.Impossible d'obtenir une alerte() pour mettre en ligne avec succès à la base de données

Je peux poster des entrées dans la base de données avec succès. Je peux les voir sur Postico quand je clique sur Entrée. Je ne peux pas sembler comprendre comment déclencher une alerte qui notifie si l'entrée a été affichée avec succès ou non. En ce moment j'ai l'alerte dans le service angulaire sur un .success etc., mais j'ai le sentiment que c'est faux. Quand je cherchais la réponse ici, d'autres personnes l'avaient dans le contrôleur mais j'ai essayé et cela n'a pas fonctionné.

Voici le code correspondant je:

createEntry.html

<form ng-submit="createBlogEntry(blog)"> 
    <h2>Title:</h2> 
     <input type="title" ng-model="blog.title"></input> 
    <br> 
    <h3>Author:</h3> 
     <input type="author" ng-model="blog.author"></input> 
    <br> 
    <h3>Photo:</h3> 
     <input type="imageUrl" ng-model="blog.imageUrl"></input> 
    <br> 
    <h3>Content:</h3> 
    <textarea type="content" rows="5" cols="50" ng-model="blog.content"> 
    </textarea> 
    <br> 
    <button type="submit">Save Entry</button> 
    </form> 

createEntryCtrl.js Le contrôleur angulaire

angular.module("blog").controller("createEntryCtrl", function($scope, adminService) { 

    $scope.createBlogEntry = function(blog){ 
     adminService.createBlogEntry(blog); 
    } 

}); 

adminService.js Le service angulaire:

angular.module("blog").service("adminService", function($http) { 

this.createBlogEntry = function (blog) {

$http.post('/api/createBlogEntry', blog) 
    .success(function(data) { 
     alert("Entry Posted"); 
    }) 
    .error(function(data) { 
     alert("Error in Posting"); 
    }) 
    } 

}); 

index.js L'Index Server (moins paramètres non pertinents)

// EXTERNAL MODULES // 
var express = require('express'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var massive = require('massive'); 

// CONFIG // 
var config = require('./config'); 

// EXPRESS // 
var app = module.exports = express(); 

app.use(express.static(__dirname + './../dist')); 
app.use(bodyParser.json()); 

// MASSIVE // 
var massiveUri = config.MASSIVE_URI; 
var massiveServer = massive.connectSync({ 
    connectionString: massiveUri 
}); 
app.set('db', massiveServer); 
var db = app.get('db'); 

var dbSetup = require('./services/dbSetup'); 
dbSetup.run(); 

// CONTROLLERS // 
var userCtrl = require('./controllers/userCtrl'); 
var blogCtrl = require('./controllers/blogCtrl'); 

// Blog Endpoints // 
app.post('/api/createBlogEntry', blogCtrl.createBlogEntry); 

// CONNECTIONS // 
var port = config.PORT; 
app.listen(port, function() { 
    console.log('Listening on port ' + port); 
}); 

blogCtrl.js Contrôleur de nœud:

var app = require('./../index'); 
var db = app.get('db'); 

module.exports = { 

createBlogEntry: function(req, res, next) { 
    console.log(res); 
    var blog = req.body; 
    db.blogs.blog_create([blog.title, blog.author, blog.imageUrl, blog.content], function(err, blog) { 
     if (err) { 
      return res.status(500).send(err); 
     } 
    }) 
    } 

}; 

blog_create.sql Le Sql:

INSERT INTO blogs (title, author, imageUrl, content) 
VALUES ($1, $2, $3, $4) 

Répondre

0

Dans le succès que vous avez besoin de recevoir un statut de code 2xx être déclenché

Essayez ceci:

db.blogs.blog_create([blog.title, blog.author, blog.imageUrl, blog.content], function(err, blog) { 
    if (err) { 
     return res.status(500).send(err); 
    }else{ 
     res.send(200); //Everything is ok ! 
    } 
}); 

Hope this aide! Et désolé pour mon anglais!

+0

Merci pour la réponse, je l'apprécie. Cela a fonctionné, alert() se déclenche maintenant et enregistre dans la base de données! Avez-vous toujours besoin de res.send (200) pour .success au travail? Cela aurait du sens – Diego

+0

Normalement dans les applications de crud après avoir sauvegardé un élément dans un db (cela signifie une insertion ou une mise à jour), s'il n'y a pas d'erreur, la réponse est l'élément (que vous envoyez) j'envoie ? car après une opération dans un db, l'item pourrait être modifié en ajoutant de nouveaux paramètres (ej: id, timestamp, etc), et ces paramètres pourraient être utiles à la vue (ej: ordonner une liste d'items par timestamp, fourni en db), faire un res.send (blog) son envoyer par défaut un statut de code 2xx, il n'est donc pas nécessaire d'appeler res.send (200) –

0

Votre service pourrait retourner un Promise. Ce faisant, vous pourriez faire comme ça:

adminService.js:

Changer ceci:

$http.post('/api/createBlogEntry', blog) 
     .success(function(data) { 
      alert("Entry Posted"); 
     }) 
     .error(function(data) { 
      alert("Error in Posting"); 
     }) 
     } 
    }); 

À:

return $http.post('/api/createBlogEntry', blog); 

Et en vous: Contrôleur

angular.module("blog").controller("createEntryCtrl", function($scope, adminService) { 

    $scope.createBlogEntry = function(blog){ 
     var promise = adminService.createBlogEntry(blog); 
     promise.then(
      function(res) { alert("Entry Posted"); }, 
      function(res) { alert("Error in Posting"); }     
     ); 
    } 

}); 

Vous pouvez voir des promesses dans angu lar here

Est-ce ce dont vous parliez?

J'espère que cela peut vous aider. :-)

+0

Merci pour cela, j'ai étudié les promesses et c'est un peu passé par-dessus ma tête. Un autre intervenant a fait remarquer qu'il me manquait un res.send (200) pour .success au travail. Cela a fonctionné et votre solution avec une promesse aussi, mais quels sont les avantages à utiliser une promesse à la place? – Diego