MEANJS TypeError:Route.all()需要回调函数但得到[对象未定义]

时间:2016-01-06 15:24:40

标签: javascript node.js mongodb express meanjs

我目前正在学习MEAN Stack,并且已经在4.1版本中使用了meanjs.org yo generator。我在我生成的应用程序中包含了CRUD示例,并将其用作我自己的代码的示例。

我遇到的错误是:

     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; })

以下是我的interview.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);
   };

以下是interview.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 个答案:

答案 0 :(得分:1)

让我们稍微缩短一下。您正在导入模块

global _start

section .data
    arr1 dq 0000000000000001h,0000000000000002h,0000000000000003h,0000000000000004h,0000000000000006h
    carry db 00
    msg1 db 'Addition Is:',10
    len1 equ $-msg1

section .bss
    addition resb 16



section .text
_start: 
    mov cl,4
    mov rsi,arr1
    mov rax,[rsi]

up: add rsi,8
    add rax,[rsi]

    jnc a1

    inc byte[carry]

a1: dec cl

    jnz up

    call display

    mov rax,1
    mov rdi,1
    mov rsi,msg1
    mov rdx,len1
    syscall

    add byte[carry],30h
    mov rax,1
    mov rdi,1
    mov rsi,carry
    mov rdx,1
    syscall

    mov rax,1
    mov rdi,1
    mov rsi,addition
    mov rdx,16
    syscall

    mov rax,60
    mov rdi,0
    syscall

display:
    mov rdi,addition
    mov cl,16

up1:
    rol rax,4
    mov rbx,rax
    and rax,0Fh
    cmp rax,09h

    ja dn1

    add rax,30h

    jmp dn

dn1:
    add rax,37h

dn: mov [rdi],rax
    mov rax,rbx
    inc rdi
    dec cl

    jnz up1

    ret

看起来像

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

然后你做

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

但很明显该模块没有app.route('/api/interviews/:interviewId').all(interviewsPolicy.isAllowed) 属性,它所拥有的唯一属性是isAllowed,这是一个函数,因此您将invokeRolesPolicies传递给{{1}功能。