默认路由到 /api/:MEANJS 中的版本

Defaulting route to /api/:version in MEANJS

我对 MEANJS, i have also been reading through its documentation 比较陌生,想了解更多。

所以,我正在尝试使用 meanjs 创建一个休息 API,使用它的 yo generator 并删除它的 angular 部分,到目前为止它是成功的。

我现在要做的是默认 url 路由的前缀为 /api/:version,到目前为止我所做的是将 /api/:version 附加到路由里面 app/ 像下面这样

//app/routes/articles.server.routes.js 
'use strict';

...

module.exports = function(app) {
    // Article Routes
    app.route('/api/:version/articles')
    ...

    app.route('/api/:version/articles/:articleId')
    ...

    // Finish by binding the article middleware
    app.param('articleId', articles.articleByID);
};

到目前为止还可以,但是我可以在某个地方声明它,这样我就不必在每次创建新路由时都添加 /api/:version 了吗?

我尝试实施 the ones stated in express documentation and Remi M's answer in this Whosebug question 但没有成功。

更新

meanjs 安装附带一个 express.js,所以我认为这是正确的地方,我尝试使用路由器对象来解决这个问题,尽管它不起作用

//config/express.js
'use strict';
...
var express        = require('express');
...
var router         = express.Router();

module.exports = function(db) {
    var app = express();

    ...

    app.use(function(req, res, next) {
        res.locals.url = req.protocol + '://' + req.headers.host + req.url;
        next();
    });

    app.use(compress({
        filter: function(req, res) {
            return (/json|text|javascript|css/).test(res.getHeader('Content-Type'));
        },
        level: 9
    }));

    ...

    config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) {
        require(path.resolve(routePath))(app);
    });
    app.use(function(err, req, res, next) {
        if (!err) return next();
        console.error(err.stack);
        res.status(500).render('500', {
            error: err.stack
        });
    });

    app.use(function(req, res) {
        res.status(404).render('404', {
            url: req.originalUrl,
            error: 'Not Found'
        });
    });

    ...

    app.use('/api/:version', router); //this is what i add

    return app;
};

您所有的初始配置都应该在路由器对象上,而不是在应用程序上例如:

'use strict';
var express        = require('express');
var router         = express.Router();

module.exports = function(db) {
 var app = express();


router.use(function(req, res, next) {
    res.locals.url = req.protocol + '://' + req.headers.host + req.url;
    next();
});

router.use(compress({
    filter: function(req, res) {
        return (/json|text|javascript|css/).test(res.getHeader('Content-Type'));
    },
    level: 9
}));

config.getGlobbedFiles('./app/routes/**/*.js').forEach(function(routePath) {
    require(path.resolve(routePath))(router);
});
router.use(function(err, req, res, next) {
    if (!err) return next();
    console.error(err.stack);
    res.status(500).render('500', {
        error: err.stack
    });
});
router.use('/bar', function(req, res, next) {
    console.log("bar endpoint called");
    res.send("bar");
});
router.use(function(req, res) {
    res.status(404).render('404', {
        url: req.originalUrl,
        error: 'Not Found'
    });
});

  app.use('/api/:version/', router); //this is what i add

  return app;
};

然后像上面那样调用app.use("prefixurl",router)。

测试 BAR API /api/v1/bar