MEAN API с использованием node-restful не отвечает - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь настроить API для нескольких проектов, использующих одну и ту же структуру базы данных (работающих на одной и той же CMS), но когда я пытаюсь получить некоторые данные, я не получаю ответ.

index.js

var express = require("express");
var cors = require("cors");
var mongoose = require("mongoose");
var bodyParser = require("body-parser");
var methodOverride = require("method-override");
var _ = require("lodash");

var passport = require("passport");
var dbconfig = require("./app/config/database");

// Create the application
var app = express();
var user = require("./app/routes/User");

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(methodOverride('X-HTTP-Method-Override'));

var connections = [];

// Auto CORS 
app.use(cors());

/* Mnual CORS Start 
app.use(function(req, res, next){
    res.header("Access-Controll-Allow-Origin", "*");
    res.header("Access-Controll-Allow-Methods", "GET,PUT,POST,DELETE");
    res.header("Access-Controll-Allow-Headers", "Content-Type");
    next();
});
/* Manual Cords end */

// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
require("./app/config/passport")(passport);

app.get("/", (req, res) => {
    res.json({ msg: "Nothing here mate" });
});

//------------ THIS IS WORKING ----------------
app.get("/db/:database/navigation", (req, res) => {

    var dbname = req.params.database;
    var conn = connections[dbname];
    var navs = conn.model("navigation", app.models[dbname].navigation);

    // Send json data/error
    if (navs) navs.find({}, (err, data) => res.json(data));
    else res.json({ error: true, msg: "Model not found" });
});
// -------------------------------------------------------

// Setup databases for all projects
_.each(dbconfig.databases, db => {
    var appModels = require("./app/models/index");
    var processed = 0;

    // We will use prefix for all routes /db/:database/
    var routePrefix = "/db/" + db.name;

    // Use user section 
    app.use(routePrefix + "/user", user);

    // Connection callback - we need to wait for modules to initialize
    var connect = () => {
        // Initialize connection 
        connections[db.name] = new mongoose.Mongoose().createConnection(db.url);

        // Create some callbacks
        connections[db.name].on("connected", () => { console.log("Connected to database " + db.url); });
        connections[db.name].on("error", onDatabaseError)

        // Once we initialize connection, we need to setup all routes 
        connections[db.name].once("open", function () {
            // Load routes
            var routes = require('./app/routes');

            // Loop trough routes and use all of them
            _.each(routes, function (controller, route) {
                var newRoute = routePrefix + route;
                app.use(newRoute, controller(app, newRoute, db.name));
            });
        });
    };

    // Initialize models
    _.each(appModels, (model, index) => {

        // Create object if doenst exist
        if (app.models == null)
            app.models = {};

        if (app.models[db.name] == null) {
            app.models[db.name] = { [model.name]: model.model };
        }
        else {
            app.models[db.name] = Object.assign(app.models[db.name], { [model.name]: model.model });
        }

        processed++;

        // if this was the last process we are ready to connect 
        if (processed === appModels.length)
            connect();
    });
});

app.listen(3000);

app / models / index.js

module.exports = [
    {
        name: "navigation",
        model: require('./Navigation.js')
    },
    ...
];

app / rout.js

module.exports = {
  '/navigation': require('./controllers/NavigationController'),
  ....
};

app / controllers / NavigationController.js

var restful = require("node-restful");

module.exports = function(app, route, dbname){

    console.log(route);

    var rest = restful.model(
        "navigation",
        app.models[dbname].navigation
    ).methods(['get', 'put', 'post', 'delete']);

    rest.register(app, route);

    // Return middleware
    return function(req, res, next){
        next();
    };
};

Navigation.js - это просто схема.Если я настраиваю маршрут вручную так:

app.get("/db/:database/navigation", (req, res) => {

    var dbname = req.params.database;
    var conn = connections[dbname];
    var navs = conn.model("navigation", app.models[dbname].navigation);

    // Send json data/error
    if (navs) navs.find({}, (err, data) => res.json(data));
    else res.json({ error: true, msg: "Model not found" });
});

, он работает просто отлично.Я предполагаю, что мне нужно назначить соединение где-нибудь на restful, но я понятия не имею, где.Если я использую одиночное соединение с mongoose.connect (), все работает отлично, но это не то, что мне нужно :)

Кто-нибудь знает, что делать дальше, чтобы это заработало?Буду признателен за любую помощь, спасибо.

1 Ответ

0 голосов
/ 28 июня 2018

Вид копался в нем и сделал расширение для изменения ссылки на драйвер

Вот все изменения, надеюсь, это поможет кому-то в будущем:)

extensions / restful / index.js

var restful = require("node-restful"),
model = require("./model"),
mongoose = require('mongoose');

exports = module.exports = restful;
exports.model = model;
exports.mongoose = mongoose;

extensions / restful / model.js

exports = module.exports = model; 
exports.changeDriver = function(driver){
    mongoose = driver; 
}
// original model function from node-restful/lib/model.js
function model() {
    var result = mongoose.model.apply(mongoose, arguments),
        default_properties = defaults();
    if (1 === arguments.length) return result;

    for (var key in default_properties) {
       result[key] = default_properties[key];
    }

    return result; 
}

app / controllers / navigation.js

var restful = require("../extensions/restful");

module.exports = function(app, route, db)
{
    restful.model.changeDriver(db.mongoose);

    // Setup controller REST
    var rest = restful.model(
        "navigation",
        app.models[db.name].navigation
    ).methods(['get', 'put', 'post', 'delete']);

    // Register this endpoint with the application
    rest.register(app, route);

    // Return middleware
    return function(req, res, next){
        next();
    };
};

index.js

....
var connect = () => {

        // Initialize connection        
        var $db = databases[_db.name] = {
            mongoose: new mongoose.Mongoose(), 
            name: _db.name
        };

        $db.mongoose.connect(_db.url);

        // Create some callbacks
        $db.mongoose.connection.on("connected", () => { console.log("Connected to database " + _db.url); });
        $db.mongoose.connection.on("error", (err) => { console.log("Database error: " + err); });

        // Once we initialize connection, we need to setup all routes 
        $db.mongoose.connection.once("open", function () {

            // Custom routes for user section
            var userRoutes = new UserRoutes($db.mongoose);   
            app.use(routePrefix + "/user", userRoutes.getRouter());

            // Load routes
            var routes = require('./app/routes');

            // Loop trough routes and use all of them
            _.each(routes, function (controller, route) {
                var newRoute = routePrefix + route;
                app.use(newRoute, controller(app, newRoute, $db));
            });
        });
    };
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...