【问题标题】:Route.delete() requires a callback function but got a [object Object]Route.delete() 需要一个回调函数但得到一个 [object Object]
【发布时间】:2025-12-20 23:30:07
【问题描述】:

我有 node-express 应用程序,其中有一堆用于登录、注销和注册的路由,还有一个用于检查授权路由的路由,只能通过提供 authToken 访问。我将 Routes 移动到单独的 Route 文件中,但出现上述错误。

这是我的用户路由文件:

const express = require('express');
const authenticate = require('./../middleware/authenticate');
const router = express.Router();
const {User} = require('./../models/user');

    router.post('/',(req, res) => {
    var body = _.pick(req.body,['email','password']);
    var user = new User(body);


    user.save().then(() => {
       return user.generateAuthToken()
    }).then((token) => {
        res.header('x-auth', token).send(user);
    }).catch((e) => {
        res.status(400).send(e);
    });
});


router.post('/login',(req, res) => {
    var body = _.pick(req.body, ['email', 'password']);
    User.findByCredentials(body.email, body.password).then((user) => {
        return user.generateAuthToken().then((token) => {
            res.header('x-auth', token).send(user);
        });
    }).catch((e) => {
        res.status(400).send(e);
    });
});

router.delete('/logout',authenticate, (req, res) => {
    req.user.removeToken(req.token).then(() => {
        res.status(200).send();
    },(e) => {
        res.status(400).send(e);
    }) ;
});


router.get('/me',authenticate, (req,res) => {
    res.send(req.user);
});


module.exports = router;

以下是我的主要 server.js 文件:

const express = require('express');
const _ = require('lodash');
var app = express();
const usersRoutes = require('./routes/users');

app.use(express.json());
app.use('/users', usersRoutes);

var {mongoose} = require('./db/mongoose');
var {User} = require('./models/user');
var {authenticate} = require('./middleware/authenticate');


const port = process.env.PORT || 3000 ;
app.listen(port, () =>  console.log(`Listening on ${port}...`))

我有一个用户模型/架构(猫鼬)文件,所以如果您觉得需要,我准备好编辑我的问题。谢谢。

【问题讨论】:

    标签: javascript node.js express routes


    【解决方案1】:

    问题在于router.delete 期望中间件参数上有一个函数(就像您在 server.js 文件中使用 app.use(express.json()) 所做的那样),因此它可以像回调一样使用,只要请求到达您的路由就会被调用.

    尝试将authenticate 更改为authenticate()

    似乎在您的用户路由文件中,您正在导入包含身份验证功能的整个模块,因此当您尝试像访问功能一样访问它时,您会收到错误消息。您需要像在 server.js 文件中那样导入它。

    const authenticate = require('./../middleware/authenticate'); 行更改为const {authenticate} = require('./../middleware/authenticate');

    【讨论】:

    • 你能不能完整回答让别人受益,你的回答没有具体描述
    • 我试过 router.delete('/logout',authenticate(), (req, res) => { req.user.removeToken(req.token).then(() => { res .status(200).send(); },(e) => { res.status(400).send(e); }) ; });我收到以下错误:身份验证不是函数
    • 似乎在您的用户路由文件中,您正在导入包含身份验证功能的整个模块,因此当尝试像函数一样访问它时会出错。您需要像在 server.js 文件中一样导入它。
    • const authenticate = require('./../middleware/authenticate'); 更改为const {authenticate} = require('./../middleware/authenticate');
    最近更新 更多