web-dev-qa-db-fra.com

Comment résoudre UnhandledPromiseRejectionWarning chez la mangouste?

J'essaie d'extraire des données en utilisant de la mangouste.

Donc, chaque fois que je dois récupérer les messages de l’API - localhost: 3000/api/posts - j’obtiens l’erreur suivante que je suis incapable de décrypter.

(node: 12100) UnhandledPromiseRejectionWarning: promesse non gérée rejet (r
ID d'éjection: 1): [MongoError: connect ETIMEDOUT xxxx]

Le foll est mon code dans le fichier api.js. J'apprécierais si vous pouviez me guider sur les points où je me trompais.

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const post = require('../models/post');

const db = "mongodb://<dbuser>:<dbpassword>@xxxxxxx.mlab.com:xxxxxx/xxxxxx";

mongoose.Promise = global.Promise;
mongoose.connect(db, function(err) {
    if(err) {
        console.log('Connection error');
    }
});

router.get('/posts', function(req, res) {
    console.log('Requesting posts');
    post.find({})
        .exec(function(err, posts) {
            if (err) {
                console.log('Error getting the posts');
            } else {
                res.json(posts);
                console.log(posts);
            }
        });
});
//in order for server.js file to access the api, we have to add the foll line
module.exports = router;

23 mai 2017

Maintenant, je reçois aussi un avertissement de dépréciation alors qu'en fait, j'ai inclus le loc suivant:

mongoose.Promise = global.Promise; //we add this because if we dont, you may get a warning that mongoose's default promise library is deprecated

J'apprécierais si je pouvais obtenir des conseils sur cette question. Merci

5
Nosail

Vous avez besoin d'un gestionnaire de rejet pour votre code, par exemple:

 router.get('/posts', function(req, res) {
    console.log('Requesting posts');
    post.find({})
        .exec()
        .then(function(posts) {
            res.json(posts);
            console.log(posts);
        })
        .catch(function(error){
            console.log('Error getting the posts');
        });
});

Ou n'utilisez pas de chaîne de promesse, utilisez simplement la fonction de rappel:

router.get('/posts', function(req, res) {
    console.log('Requesting posts');
    post.find({}, function(err, posts){
        if (err) {
            console.log('Error getting the posts');
        } else {
            res.json(posts);
            console.log(posts);
        }
    })
});
2
Sergaros

La bonne façon de le gérer est d’ajouter une clause catch.

const mongoose = require('mongoose');
mongoose.connect(process.env.MONGODB_URI).catch(function (reason) {
    console.log('Unable to connect to the mongodb instance. Error: ', reason);
});
0
Andrey Petrov

Ajouter ma réponse car les autres ne donnent pas une image claire.

Puisque vous rendez mongoose disponible sous forme de promesse globale mongoose.Promise = global.Promise, vous devez gérer la promesse à l'aide de .then() et .catch()

Voici comment:

...
mongoose.Promise = global.Promise;
mongoose.connect(db)
  .then(res => console.log("Connected to DB"))
  .catch(err => console.log(err))
...
0
m-ketan