【问题标题】:How to structure my project folder when building a secured NodeJs REST API构建安全的 NodeJs REST API 时如何构建我的项目文件夹
【发布时间】:2017-04-02 22:21:43
【问题描述】:

我正在使用 NodeJS 和 Express 构建一个 REST API,由 MongoDB 数据库提供支持。 几天来,我一直在努力确定正确的文件夹结构。到目前为止,我可以在没有 API 的情况下连接到我的数据库并添加新用户,而只需执行 GET、POST 等请求。我在网上看过几个关于如何使用 node 构建 API 的教程,但是没有一个有更标准化的方法来设置它们的文件夹结构。这就是为什么鉴于我当前的文件夹结构,我很难让它工作。

这是我的文件夹结构

app  
---models  
------user.js  
---api.js  
---routes.js  
config  
---auth.js  
---database.js  
---passport.js  
public  
views
package.json  
server.js  

Server.js

// server.js

// set up ======================================================================
// get all the tools we need
var express  = require('express');
var app      = express();
var port     = process.env.PORT || 2016;
var mongoose = require('mongoose');
var passport = require('passport');
var flash    = require('connect-flash');


var configDB = require('./config/database.js');

// configuration ===============================================================
mongoose.connect(configDB.url); // connect to our database

require('./config/passport')(passport); // pass passport for configuration

app.configure(function() {

    // set up our express application
    app.use(express.logger('dev')); // log every request to the console
    app.use(express.cookieParser()); // read cookies (needed for auth)
    app.use(express.bodyParser.json()); // get information from html forms
    app.use(bodyParser.urlencoded({ extended: true }));
    app.set('views', path.join(__dirname + '/views'));
    app.set('view engine', 'ejs'); // set up ejs for templating

    // set the static files location /public/img will be /img for users
    app.use(express.static(__dirname + '/public'));

    // required for passport
    app.use(express.session({ secret: 'xxxxxxxxx' })); // session secret
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash()); // use connect-flash for flash messages stored in session



});

// routes ======================================================================
// require('./app/routes')(app, passport); // load our routes and pass in our app and fully configured passport
// require('./app/api')(api, passport);

app.use('/', require('./app/routes')(app, passport));
app.use('/api', require('./app/api')(api, passport));

// error handlers
// Catch unauthorised errors
app.use(function (err, req, res, next) {
  if (err.name === 'UnauthorizedError') {
    res.status(401);
    res.json({"message" : err.name + ": " + err.message});
  }
  next();
});

// launch ======================================================================
app.listen(port);
console.log('Live on port ' + port);

api.js

var User = require('./models/user');
var express  = require('express');
var apiRoutes = express.Router();
app.use('/api', apiRoutes);

module.exports = function(apiRoutes, passport){

    apiRoutes.get('/testapi', function (req,res) {
        res.json({SecretData: 'abc123'});
    });

}

每次我到达端点 /testapi 时都会收到错误 "Cannot GET /testapi"
我认为我的主要问题是如何正确组织我的文件和文件夹并以正确的方式导入/要求它们。谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript node.js mongodb rest


    【解决方案1】:

    服务器.js

    在这条线上app.use('/api', require('./app/api')(api, passport)); 在这里,您通过传递“api”和“passport”作为参数来告诉 Express 使用 ./app/api 作为中间件。

    您在哪里定义了api 变量?

    假设它是一个错字。在这种情况下,您正在从“app/api.js”导出一个函数,并尝试在 server.js app.use('/api', require('./app/api')(api, passport)); 中执行它,返回未定义。

    Express 将期待一个函数作为中间件,而不是函数的返回值。

    app/api.js

    在第 4 行你有 app.use('/api', apiRoutes); 这没有任何意义,因为 api.js 不知道“应用程序”。

    清理您的 server.js 和 api.js 并重试

    本教程可能对Node with Express有帮助

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 2020-06-10
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2019-10-13
      相关资源
      最近更新 更多