Nodejs Router require function but got an Object
每当我尝试使用
我不确定下面的代码到底有什么问题
错误:
C:\\Users\\Desktop\\Projet\\test\\Todo\
ode_modules\\express\\lib\
outer\\index.js:458
throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
^TypeError: Router.use() requires a middleware function but got a Object
at Function.use (C:\\Users\\Desktop\\Projet\\test\\Todo\
ode_modules\\express\\lib\
outer\\index.js:458:13)
at Object. (C:\\Users\\Desktop\\Projet\\test\\Todo\\server\\api\\index.js:3:8)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object. (C:\\Users\\Desktop\\Projet\\test\\Todo\\server.js:23:13)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
我的server.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | //Import dependencies const express = require('express'); const path = require('path'); const http = require('http'); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); //Connect to MongoDB server mongoose.connect('mongodb ://localhost/todoApp'); mongoose.set('debug',true); //Import models require('./server/models/Task'); require('./server/models/Todo'); //Get and Set API routes const api = require('./server/api/'); app.use('/api',apiRoutes) //Init express const app = express(); //Enable bodyParser app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended:false})); //Enable CORS app.use(function(req,res,next){ res.header("Access-Control-Allow-Origin","*"); res.header("Access-Control-Allow-Methods","GET, POST ,DELETE, PUT"); res.header("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, Authorization") next() }); //Get env port const port = process.env.PORT ||"3000"; app.set('port',port); //Create HTTP server. const server = http.createServer(app); //Listen on port server.listen(port,() => console.log('Api running on localhost :${port}')); |
和我的控制器路由所在的文件:
1 2 3 4 5 6 7 8 | var router = require('express').Router(); router.use('/todo',require('./todo')); router.use('/todo/task',require('./task')); module.exports = router ; |
待办事项文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | const router = require('express').Router(); const mongoose = require('mongoose'); const Todo = mongoose.model('Todo'); const Task = mongoose.model('Task'); router.param('todo', function (req, res, next, id) { if (!id.match(/^[0-9a-fA-F]{24}$/)) { return res.sendStatus(422); } Todo.findById(id) .populate('tasks') .then(function (todo) { if (!todo) { return res.sendStatus(404); } req.todo = todo; return next(); }); }); router.get('/',(req,res)=>{ Todo.find() .populate('tasks') .then((todos)=>{ if (!todos){return res.sendStatus(404);} return res.json({ todos:todos.map((todo)=>{ return todo.toDto(); }) }).statusCode(200); }); }); router.post('/', (req, res) => { if (!req.body.title) { res.sendStatus(422); } let todo = new Todo(); todo.title = req.body.title; todo.save().then(() => { res.json(todo.toDto()).statusCode(201); }) }); router.delete('/:todo', (req, res) => { req.todo.remove().then(function () { return res.sendStatus(200); }); }); |
任务文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | const router = require('express').Router(); const mongoose = require('mongoose'); const Todo = mongoose.model('Todo'); const Task = mongoose.model('Task'); router.param('task',function(req,res,next,id){ if(!id.match(/^[0-9a-fA-F]{24}$/)){ return res.sendStatus(422); } Task.findById(id).then ((task) =>{ if(!task){return res.sendStatus(404);} req.task = task; return next(); }) }) router.post('/', (req, res) => { if (!req.body.todoId || !req.body.content) { res.sendStatus(422); } if (!req.body.todoId.match(/^[0-9a-fA-F]{24}$/)) { res.sendStatus(422); } Todo.findById(req.body.todoId).then((todo) => { if (!todo) { res.statusCode(404); } let task = new Task(); task.content = req.body.content; task.state = false; task.todo = todo; task.save().then(() => { todo.tasks.push(task); todo.save().then(() => { res.json(task.toDto()).statusCode(201); }); }); }); }); router.put('/', (req, res) => { if (req.body.state == undefined || !req.body.id) { res.sendStatus(422); } if (!req.body.id.match(/^[0-9a-fA-F]{24}$/)) { res.sendStatus(422); } Task.findById(req.body.id).then((task) => { task.state = req.body.state; task.save().then(() => { res.json(task.toDto()).statusCode(200); }); }); }); router.delete('/:task', (req, res) => { let task = req.task; task.remove().then(() => { res.sendStatus(200); }); }); |
1 2 3 4 5 6 7 | //Init express const app = express(); //Get and Set API routes const api = require('./server/api/'); app.use('/api',apiRoutes) |
将apiRoutes更改为api。 apiRoutes未定义
在设置路由器之前初始化Express。