2015-10-01 26 views
1

這是我server.js文件和api.js文件。我在排序函數中發現一個錯誤,我打算根據它們的屬性搜索js對象。事件Schema具有名稱,位置,價格,評分等屬性。我試圖根據它們的價格進行分類。類型錯誤:app.use()需要中間件功能

server.js

var express= require('express'); 
var bodyParser= require('body-parser'); 
var morgan = require('morgan'); 
var config=require('./config'); 
var app= express(); 
var mongoose=require('mongoose'); 
//var User=require('./database/user') 
mongoose.connect('mongodb://localhost:27017/db',function(err){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     console.log("connected!"); 
    } 
}); 

app.use(bodyParser.urlencoded({extended: true })); //if false then parse only strings 
app.use(bodyParser.json()); 
app.use(morgan('dev'));//log all the requests to the console 
var api=require('./app/routes/api')(app,express); 
app.use('/api',api); 
app.get('*',function(req,res){ 
    res.sendFile(__dirname + '/public/views/index.html'); 
}); // * means any route 

app.listen(config.port,function(err){ 
    if(err){enter code here 
     console.log(err); 
    } 
    else{ 
     console.log("The server is running"); 
    } 
}); 
module.exports = router; 

api.js

var User = require('../models/user'); 
var Event = require('../models/event'); 
var config = require('../../config'); 
var secret = config.secretKey; 

module.exports = function (app, express) { 
    var api = express.Router(); 
    app.use() 

    api.post('/signup', function (req, res) { 
     var user = new User({ 
      name: req.body.name, 
      username: req.body.username, 
      password: req.body.password 
     }); 
     user.save(function (err) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json({ 
       message: 'User created!' 
      }); 
     }); 

    }); 

    api.get('/users', function (req, res) { 
     User.find({}, function (err, users) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json(users); 
     }); 
    }); 

    api.post('/eventfeed', function (req, res) { 
     var event = new Event({ 
      name: req.body.name, 
      location: req.body.location, 
      description: req.body.description, 
      price: req.body.price, 
      rating: req.body.rating 
     }); 

     event.save(function (err) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json({ 
       message: 'Event created!' 
      }); 
     }); 
    }); 

    // utility function for sorting an array by a key in alpha order 
    api.get('/sortby_price', function (err) { 
     if (err) return err; 
      // utility function for sorting an array by a key in parsed numeric order 
     else { 
      function sortArrayNum(arr, key) { 
       arr.sort(function (a, b) { 
        return parseInt(a[key], 10) - parseInt(b[key], 10); 
       }); 
      } 

      var dicts = EventSchema.saved; 
      for (var i = 0; i < dicts.length; i++) { 
       var terms = dicts[i].terms; 
       sortArrayNum(terms, "price"); 
      } 
     } 
     return api; 
    }); 
} 

這是我的錯誤。我正在第一次使用這個網頁。請幫助我,這個錯誤告訴了什麼。

TypeError: app.use() requires middleware functions
at EventEmitter.use (c:\Users\MY APY\WebstormProjects\Main\node_modules\express\lib\application.js:209:11)
at module.exports (c:\Users\MY LAPY\WebstormProjects\Main\app\routes\api.js:10:9)
at Object. (c:\Users\MY LAPY\WebstormProjects\Main\server.js:20:36)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3

+0

你見過http://stackoverflow.com/questions/31496100/cannot-app-usemulter-requires-middleware-function-error? –

回答

2

中間件是與訪問請求對象(REQ),響應對象(RES),並且在應用程序的請求 - 響應週期的下一個中間件,由下一個命名的變量通常表示的函數。

中間件可以:

  • 執行的任何代碼。
  • 更改請求和響應對象。
  • 結束請求 - 響應循環。
  • 調用堆棧中的下一個中間件。

如果當前中間件沒有結束請求 - 響應週期,則必須調用next()將控制權交給下一個中間件,否則請求將被掛起。

在api.js行號10爲無效

app.use() 

app.use必須具備的功能與3個PARAMS

// a middleware with no mount path; gets executed for every request to the app 
app.use(function (req, res, next) { 
    console.log('Time:', Date.now()); 
    next(); 
}); 
如果你想只有很少選擇的路徑來使用這個中間件可以

做這樣的事情

// a middleware mounted on /user/:id; will be executed for any type of HTTP request to /user/:id 
app.use('/user/:id', function (req, res, next) { 
    console.log('Request Type:', req.method); 
    next(); 
}); 

// a route and its handler function (middleware system) which handles GET requests to /user/:id 
app.get('/user/:id', function (req, res, next) { 
    res.send('USER'); 
}); 

看看expressjs文件它是不錯的。 http://expressjs.com/guide/using-middleware.html

+0

'app.use'不需要有3個參數。它只需要你有興趣使用的參數..如果你不想傳遞下游,你可以輕鬆地省略'next'。 OP的最大問題,除了他的錯誤'app.use()'外,還有他的外部模塊沒有返回中間件,但是這是掛載在他的主文件中。 –

+0

感謝我對node.js.的同樣新的信息。 –

1

app.use要求您傳遞一個函數作爲中間件使用。你有兩個例子,你不這樣做會導致這個錯誤;兩者都在api.js

api.js:10app.use()

你不通過一個函數來.use(),所以這會導致錯誤。這是您在帖子中看到的錯誤。

然而,你會得到另一個錯誤:

var api=require('./app/routes/api')(app,express); 
app.use('/api',api); 

本節試圖安裝到您的./app/routes/api模塊函數的返回值作爲中間件。但是,我們可以在代碼中看到實際上並沒有從api.js中的函數返回值;你不是從路由處理程序內返回路由器..

// utility function for sorting an array by a key in alpha order 
api.get('/sortby_price', function (err) { 
    if (err) return err; 
     // utility function for sorting an array by a key in parsed numeric order 
    else { 
     function sortArrayNum(arr, key) { 
      arr.sort(function (a, b) { 
       return parseInt(a[key], 10) - parseInt(b[key], 10); 
      }); 
     } 

     var dicts = EventSchema.saved; 
     for (var i = 0; i < dicts.length; i++) { 
      var terms = dicts[i].terms; 
      sortArrayNum(terms, "price"); 
     } 
    } 
    return api; // <- this will be returned inside the app.get call 
}); 

而應該提出這個了處理,並以你的函數結束。

總修正代碼如下所示:

module.exports = function (app, express) { 
    var api = express.Router(); 
    ..omitted for brevity.. 

    // utility function for sorting an array by a key in alpha order 
    api.get('/sortby_price', function (err) { 
     if (err) return err; 
      // utility function for sorting an array by a key in parsed numeric order 
     else { 
      function sortArrayNum(arr, key) { 
       arr.sort(function (a, b) { 
        return parseInt(a[key], 10) - parseInt(b[key], 10); 
       }); 
      } 

      var dicts = EventSchema.saved; 
      for (var i = 0; i < dicts.length; i++) { 
       var terms = dicts[i].terms; 
       sortArrayNum(terms, "price"); 
      } 
     } 
    }); 
    return api; 
} 
+0

我刪除了這些錯誤。是我的錯。我沒有看到,但是當我打開/ api/sortby_price它沒有響應,當我調試它,它甚至沒有進入函數。什麼可能是錯誤? – Nkav

相關問題