2016-06-11 49 views
0

我正在使用由MongoDB數據庫支持的NodeJS和Express構建REST API。 我一直在努力尋找正確的文件夾結構。到目前爲止,我可以連接到我的數據庫並添加新用戶而無需API,但只需執行GET,POST等請求即可。我已經在網上看到了幾篇關於如何使用節點構建API的教程,但是他們都沒有更加標準化的設置文件夾結構的方法。這就是爲什麼我在現有文件夾結構下工作如此艱難的原因。如何在構建受保護的NodeJs REST 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"
我認爲我的主要問題是如何正確組織我的文件和文件夾,並導入/要求他們正確的方式。任何人都可以幫我解決這個問題嗎?

回答

0

Server.js

在這條線app.use('/api', require('./app/api')(api, passport)); 在這裏,你是在告訴快遞通過傳遞「API」和「護照」作爲參數使用./app/api作爲中間件。

您在哪裏定義了api變量?

讓我們假設它是一個拼寫錯誤..在這種情況下,從「app/api.js」導出函數,然後嘗試在server.js app.use('/api', require('./app/api')(api, passport));中執行它,它返回undefined。

Express將期待函數作爲中間件而不是函數的返回值。

應用程序/ api.js

第4行,你有app.use('/api', apiRoutes);不作任何意義,因爲api.js沒有關於 「應用程序」 的想法。

清理你的server.js和api.js,然後再試一次

本教程可以幫助Node with Express