如何修复“ TypeError:无法在expressjs REST API中读取未定义的属性'body'”

时间:2019-06-18 01:26:37

标签: node.js mongodb express

我正在使用Express设置REST API,最终我定义了一些可行的端点和方法,当突然出现错误时: “ TypeError:无法读取未定义的属性'body'”

我对JS还是陌生的,我正在尝试使用mongodb构建一个Web应用程序,进行表达和做出反应。

我一直在遵循一些指南(特别是因为它也实现了JWT:https://www.toptal.com/nodejs/secure-rest-api-in-nodejs

我设法为基本的CRUD操作构建了所有用户方法,并公开了它们。一切正常,然后我尝试使用中间件添加Auth进程,并且发生了错误。

我在寻找答案,最常见的错误是由于在路由之后调用了body-parser。但就我而言,我在工作正常的用户路由之前调用了auth路由。

这是我的git repo以获取更多详细信息: https://github.com/pidanou/btb_api

const config = require("./config/env.config");

const express = require("express");
const bodyParser = require("body-parser");
const app = express();

const authRouter = require("./routes/auth.routes");
const userRouter = require("./routes/users.routes");

app.use(function(req,res,next){
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Credentials', 'true');
    res.header('Access-Control-Allow-Methods', 
'GET,HEAD,PUT,PATCH,POST,DELETE');
    res.header('Access-Control-Expose-Headers', 'Content-Length');
    res.header('Access-Control-Allow-Headers', 'Accept, Authorization, 
Content-Type, X-Requested-With, Range');
    if (req.method === 'OPTIONS') {
        return res.send(200);
    } else {
        return next();
    }
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));

authRouter.authRoutesConfig(app);
userRouter.userRoutesConfig(app);

app.listen(config.port, () => console.log(`Listening on port 
${config.port}`));

authRoute的代码:

const verifyUserMiddle = require("../middlewares/verify.user.middle");
const authController = require("../controllers/auth.controller");

exports.authRoutesConfig = function (app) {

    app.post('/auth', [
        verifyUserMiddle.hasAuthValidFields(),
        verifyUserMiddle.isPasswordAndUserMatch(),
        authController.login()
    ])

}

控制器代码:

const jwtSecret = require('../config/env.config').jwt_secret,
    jwt = require("jsonwebtoken");
const cyrpto = require("crypto");

exports.login = (req, res) => {

    try {
        let refreshId = req.body.userId + jwtSecret;
        let salt = crypto.randomBytes(16).toString("base64");
        let hash = cyrpto.createHmac("sha512", 
salt).update(refreshId).digest("base64");
        req.body.refreshKey = salt;
        let token = jwt.sign(req.body, jwtSecret);
        let b = new Buffer(hash);
        let refresh_token = b.toString("base64");
        res.status(201).send({accessToken: token, refresh_token: 
refresh_token});
    }catch(err){
        res.status(500).send({errors: err});
    }

} 

由于用户部分工作正常,我认为auth也可以,但是事实并非如此。 似乎在主体解析器之前调用了中间件。 该错误首先发生在中间件中。

1 个答案:

答案 0 :(得分:1)

这里不是人体分析器问题-可以正常工作。如您所见,您的exports.login = (req, res) => {...}具有reqres参数,但是如何接收它们呢?

authController.login()中使用parantheses()可以防止这种情况的发生,只要它们存在,您的应用就会崩溃并给出此类错误。

因此更改为:

  app.post('/auth', [
        (your code),
        authController.login
    ])  

不带括号。