Nodejs路由器需要功能但有一个对象

Posted

技术标签:

【中文标题】Nodejs路由器需要功能但有一个对象【英文标题】:Nodejs Router require function but got an Object 【发布时间】:2018-12-03 04:45:12 【问题描述】:

每当我尝试使用app.use() 初始化路由时,从路由目录调用我的路由器时出现错误。我得到的错误是Router.use() 需要middleware 函数,但得到了Object。 我不确定下面的代码到底有什么问题

错误:

C:\Users\Desktop\Projet\test\Todo\node_modules\express\lib\router\index.js:458 throw new TypeError('Router.use() 需要一个中间件函数但得到一个' + gettype(fn)) ^

TypeError: Router.use() 需要一个中间件函数但得到一个对象 在 Function.use (C:\Users\Desktop\Projet\test\Todo\node_modules\express\lib\router\index.js:458:13) 在对象。 (C:\Users\Desktop\Projet\test\Todo\server\api\index.js:3:8) 在 Module._compile (module.js:652:30) 在 Object.Module._extensions..js (module.js:663:10) 在 Module.load (module.js:565:32) 在 tryModuleLoad (module.js:505:12) 在 Function.Module._load (module.js:497:3) 在 Module.require (module.js:596:17) 在要求(内部/module.js:11:18) 在对象。 (C:\Users\Desktop\Projet\test\Todo\server.js:23:13) 在 Module._compile (module.js:652:30) 在 Object.Module._extensions..js (module.js:663:10) 在 Module.load (module.js:565:32) 在 tryModuleLoad (module.js:505:12) 在 Function.Module._load (module.js:497:3) 在 Function.Module.runMain (module.js:693:10)

我的 server.js:

//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'));

和我的控制器路由所在的文件:

var router = require('express').Router();

router.use('/todo',require('./todo'));
router.use('/todo/task',require('./task'));



module.exports = router ; 

待办事项文件:

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

任务文件:

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

【问题讨论】:

你到底有什么不明白的? router.use 接受一个函数。你在C:\Users\Desktop\Projet\test\Todo\server\api\index.js:3:8 传递一个对象require('./todo') 是一个对象,而不是一个函数。 请显示“./todo”和“./task”模块 router.use('/todo',require('./todo'));require('./todo') 返回一个对象,因此您需要检查您在该文件中导出的内容。 我认为问题出在您的 ./todo./task 模块中 您在任务和待办事项中缺少module.exports = router; 【参考方案1】:
//Init express
const app = express();

//Get and Set API routes

const api = require('./server/api/');
app.use('/api',apiRoutes)

将 apiRoutes 更改为 api。 apiRoutes 未定义 设置路由器前初始化express。

【讨论】:

我仍然有同样的错误

以上是关于Nodejs路由器需要功能但有一个对象的主要内容,如果未能解决你的问题,请参考以下文章

引用nodejs的url模块实现url路由功能

初学node.js-nodejs中实现修改用户路由

初学node.js-nodejs中实现用户注册路由

NodeJS框架express的途径映射(路由)功能及控制

Nodejs动态加载路由,Nodejs遍历目录,Nodejs路由工具

nodejs动态路由