Estoy creando una API de servicio web relajante usando NodeJS. Usa Mongoose como ODM y usa MongoDB para el backend. A continuación explicaré mi escenario.
Inicié el servidor nodejs. Después de eso, cerré la base de datos MongoDB. Luego llame a la llamada GET api, no detecta ningún error y la llamada api se bloquea.
configuración de la base de datos en el archivo main.js
var mongoose = require('mongoose'); var uri = 'mongodb://localhost/mydb'; mongoose.Promise = global.Promise; var options = { server: {socketOptions: { keepAlive: 300000, connectTimeoutMS: 10000 } } } ; mongoose.connect(uri,options); var db = mongoose.connection; db.on('error',console.log.bind(console,'connection refused !!!!!')); db.once('open', console.log.bind(console,'connection success !!!!!'));esta es mi llamada GET básica
var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); var rootRes = require('../model/rootresources.js'); router.get('/', function(req, res, next) { rootRes.find({},function (err, rootResource) { if (err){ console.log('Error occurd !!!') } res.json(rootResource); }); });Incluso la conexión de la base de datos falló, el código no va al bloque de errores. Por lo tanto, no capturó el rechazo de la base de datos cuando falla la conexión de la base de datos en la llamada API.
Quiero capturar ese error y enviar el error interno del servidor (código: 500) al cliente. Traté de encontrar la solución pero aún no pude encontrarla ¿Alguna solución o cometí un error?
gracias amila
¿Puso las dos partes del código en el mismo archivo (es decir, main.js) o en dos archivos diferentes?
colóquelos en el mismo archivo y ejecute node main.js para lanzar excepciones.
// main.js var mongoose = require('mongoose'); var uri = 'mongodb://localhost/mydb'; mongoose.Promise = global.Promise; var options = { server: {socketOptions: { keepAlive: 300000, connectTimeoutMS: 10000 } } } ; mongoose.connect(uri,options); var db = mongoose.connection; db.on('error',console.log.bind(console,'connection refused !!!!!')); db.once('open', console.log.bind(console,'connection success !!!!!')); var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); var rootRes = require('../model/rootresources.js'); router.get('/', function(req, res, next) { rootRes.find({},function (err, rootResource) { if (err){ console.log('Error occurd !!!') } res.json(rootResource); }); });las excepciones son:
connection refused !!!!! { MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017] etc... Entonces, creo que tal vez pongas códigos sobre express en un archivo como index.js y códigos sobre la mongoose connection en otro archivo. Y simplemente ejecute node index.js en la línea de comando. Si bien la ejecución de códigos en index.js no incluirá códigos en otros archivos, los códigos en main.js no se ejecutarán. Como resultado, no hay información de error.
Actualizaciones Dos formas de Conozco dos formas de hacer esto:
1. En main.js, cree la función que crea una conexión a la base de datos y devuelve una instancia de db para que pueda llamarla función en su código principal.
// main.js like this var mongoose = require('mongoose'); function createConnection(url) { mongoose.connect(url,options); var db = mongoose.connection; db.on('error',console.log.bind(console,'refused !!!!!')); db.once('open', console.log.bind(console,'success !!!!!')); return db; } // export function module.exports = createConnection; // in your index.js var createConnection = require('./main.js'); var db = createConnection(url); // other codes here 2. Usar require o vm para compilar y ejecutar código javascipt. Puede encontrar detalles de vm api aquí
//main.js var mongoose = require('mongoose'); var uri = 'mongodb://localhost/mydb'; mongoose.Promise = global.Promise; var options = { server: {socketOptions: { keepAlive: 300000, connectTimeoutMS: 10000 } } } ; mongoose.connect(uri,options); var db = mongoose.connection; db.on('error',console.log.bind(console,'connection refused !!!!!')); db.once('open', console.log.bind(console,'connection success !!!!!')); // index.js // require will load file and execute automaticly var scriptSrc = require('./main'); // other codes here Puede pensar en la segunda forma usando eval('var mongoose = require('mongoose'); var uri = 'mongodb://localhost/mydb'; etc... )
La conexión de mangosta no ocurre a menos que haga clic en una solicitud. así que es mejor que lo maneje en su primer middleware de solicitud. vea la información del código a continuación.
module.exports = function () { return function (req, res, next) { mongoose.connect(URL, MONGO_OPTIONS); mongoose.connection .once('open', () => { }) .on('error', (error) => { res.status(401).json({}); }); ...Luego pase el middleware anterior a su enrutador: avíseme si necesita más explicaciones
router.get('/', myMiddleware(){})