2016-01-06 42 views
0

我目前正在學習MEAN堆棧,並且已經在版本4.1中使用meanjs.org yo generator。我在我生成的應用程序中包含了CRUD示例,並將其用作我自己的代碼的示例。MEANJS TypeError:Route.all()需要回調函數,但得到[對象未定義]

我遇到的錯誤是:

 TypeError: Route.all() requires callback functions but got a [object Undefined] 
    at Route.all (/Users/username/git/interview-app/node_modules/express/lib/router/route.js:173:13) 
    at module.exports (/Users/username/git/interview-app/modules/interviews/server/routes/interviews.server.routes.js:9:32) 
    at /Users/username/git/interview-app/config/lib/express.js:183:37 
    at Array.forEach (native) 
    at Object.module.exports.initModulesServerRoutes (/Users/username/git/interview-app/config/lib/express.js:182:30) 
    at Object.module.exports.init (/Users/username/git/interview-app/config/lib/express.js:248:8) 
    at /Users/username/git/interview-app/config/lib/app.js:29:23 
    at /Users/username/git/interview-app/config/lib/mongoose.js:36:15 
    at open (/Users/username/git/interview-app/node_modules/mongoose/lib/connection.js:488:17) 
    at NativeConnection.Connection.onOpen (/Users/username/git/interview-app/node_modules/mongoose/lib/connection.js:498:5) 
    at /Users/username/git/interview-app/node_modules/mongoose/lib/connection.js:457:10 
    at /Users/username/git/interview-app/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js:60:5 
    at /Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb/lib/db.js:229:5 
    at connectHandler (/Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb/lib/server.js:279:7) 
    at g (events.js:260:16) 
    at emitOne (events.js:77:13) 
    at emit (events.js:169:7) 
    at /Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:409:23 
    at /Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:778:13 
    at Callbacks.emit (/Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:95:3) 
    at null.messageHandler (/Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:249:23) 
    at Socket.<anonymous> (/Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:262:22) 
/Users/username/git/interview-app/node_modules/mongoose/node_modules/mongodb/lib/server.js:282 
     process.nextTick(function() { throw err; }) 

這裏是我的interviews.server.routes.js代碼:

*** interviews.server.routes.js *** 

    'use strict'; 

    // Module dependencies 
    var interviewsPolicy = require('../policies/interviews.server.policy'), 
     interviews = require('../controllers/interviews.server.controller');s 

    module.exports = function (app) { 
     //Interviews collection routes 
     app.route('/api/interviews').all(interviewsPolicy.isAllowed) 
     .get(interviews.list) 
     .post(interviews.create); 

     // Single Interview routes 
     app.route('/api/interviews/:interviewId').all(interviewsPolicy.isAllowed) 
     .get(interviews.read) 
     .put(interviews.update) 
     .delete(interviews.delete); 

    // Bind the interview to middleware 
    app.param('interviewId', interviews.interviewByID); 
    }; 

下面是模塊依賴的代碼interviews.server.routes.js。

政策代碼:

*** interviews.server.policy.js *** 

    'use strict'; 
    //Module dependencies 
    var acl = require('acl'); 

    // Using the memory backend 
    acl = new acl(new acl.memoryBackend()); 

    // Invoke Interviews Permissions 
    exports.invokeRolesPolicies = function() { 
     acl.allow([{ 
     roles: ['admin'], 
     allows: [{ 
      resources: '/api/interviews', 
      permissions: '*' 
     }, 
     { 
      resources: '/api/interviews/:interviewId', 
      permissions: '*' 
     }] 
     }, 
     { 
     roles: ['user'], 
     allows: [{ 
      resources: '/api/interviews', 
      permissions: ['get', 'post'] 
     }, 
     { 
      resources: '/api/interviews/:interviewId', 
      permissions: ['get'] 
     }] 
     }, 
     { 
     roles: ['guest'], 
     allows: [{ 
      resources: '/api/interviews', 
      permissions: ['get'] 
     }, 
     { 
      resources: '/api/interviews/:interviewId', 
      permissions: ['get'] 
     }] 
     }]); 
    }; 

控制器代碼:

'use strict'; 

// Module dependencies 
var path = require('path'), 
    mongoose = require('mongoose'), 
    Interview = mongoose.model('Interview'), 
    errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')); 

// Create an Interview 
exports.create = function (req, res) { 
    var interview = new Interview(req.body); 
    interview.user = req.user; 

    interview.save(function (err) { 
    if (err) { 
     return res.status(400).send({ 
     message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.json(interview); 
    } 
    }); 
}; 

// Show the current Interview 
exports.read = function (req, res) { 
    res.json(req.interview); 
}; 

// Update Interview 
exports.update = function (req, res) { 
    var interview = req.interview; 

    interview.title = req.body.title; 
    interview.question = req.body.question; 
    interview.answer = req.body.answer; 

    interview.save(function (err) { 
    if (err) { 
     return res.status(400).send({ 
     message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.json(interview); 
    } 
    }); 
}; 

// Delete Interview 
exports.delete = function (req, res) { 
    var interview = req.interview; 

    interview.remove(function (err) { 
    if (err) { 
     return res.status(400).send({ 
     message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.json(interview); 
    } 
    }); 
}; 

// List of Interviews 
exports.list = function (req, res) { 
    Interview.find().sort('-created').populate('user', 'displayName').exec(function (err, interviews) { 
    if (err) { 
     return res.status(400).send({ 
     message: errorHandler.getErrorMessage(err) 
     }); 
    } else { 
     res.json(interview); 
    } 
    }); 
}; 

// Article middleware 
exports.interviewByID = function (req, res, next, id) { 

    if (!mongoose.Types.ObjectId.isValid(id)) { 
    return res.status(400).send({ 
     message: 'Interview is invalid' 
    }); 
    } 

    Interview.findById(id).populate('user', 'displayName').exec(function (err, interview) { 
    if (err) { 
     return next(err); 
    } else if (!interview) { 
     return res.status(400).send({ 
     message: 'No interview with that identifier has been found' 
     }); 
    } 
    req.interview = interview; 
    next(); 
    }); 
}; 

在我的package.json我使用: 快遞:4.13.1, 貓鼬:4.2.3, 節點: 0.12.0

任何幫助,將不勝感激。請詢問您是否需要更多信息。 謝謝 - B

+1

歡迎來到StackOverflow!雖然我們對巨型帖子沒有嚴格的政策,但它可以阻止讀者想要幫助你(沒有人在XXI世紀= /)。你有沒有試圖排除一些可能性?靠近問題的位置?請閱讀[最小化,可驗證,可運行示例](http://stackoverflow.com/help/mcve) –

回答

1

讓我們縮短一點。要導入一個模塊

var interviewsPolicy = require('../policies/interviews.server.policy'), 

,看起來像

exports.invokeRolesPolicies = function() { 
    // stuff 
}; 

,然後你做

app.route('/api/interviews/:interviewId').all(interviewsPolicy.isAllowed) 

但顯然模塊沒有isAllowed財產,它的屬性是invokeRolesPolicies ,這是一個函數,所以你將undefined傳遞給Route.all函數。

相關問題