Как исправить «TypeError: Не удается прочитать свойство 'body' из undefined 'в REST API expressjs" - PullRequest
2 голосов
/ 18 июня 2019

Я настраиваю REST API с помощью Express, в итоге я определил некоторые конечные точки и методы, которые работают, когда внезапно появляется ошибка: "TypeError: Невозможно прочитать свойство 'body' of undefined"

IЯ довольно новичок в JS, и я пытаюсь создать веб-приложение, используя mongodb, выражать и реагировать.

Я следовал некоторым руководствам (в частности этому, потому что он также реализует JWT: https://www.toptal.com/nodejs/secure-rest-api-in-nodejs)

Мне удалось собрать все пользовательские методы для основных операций CRUD и разоблачить их. Все работает нормально, затем я попытался добавить процесс Auth с промежуточным программным обеспечением, и произошла ошибка.

Iискал ответ, чаще всего ошибка происходила из-за того, что body-parser вызывался после маршрутов, но в моем случае я вызываю auth route как раз перед пользовательским маршрутом, который работает нормально.

Вот мой мерзавецрепо для более подробной информации: 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});
    }

} 

Так как пользовательская часть работалахорошо, я думал, что авторизация будет тоже, но это не так.Похоже, что промежуточное ПО вызывается перед body-parser.Ошибка происходит сначала в промежуточном программном обеспечении.

1 Ответ

1 голос
/ 18 июня 2019

Это не проблема парсера здесь - он работает нормально.Как вы можете видеть, у ваших exports.login = (req, res) => {...} есть параметры req и res, но как они принимаются?

Имея parantheses () в вашем authController.login(), вы предотвратили это, и пока они присутствуют, ваше приложение будет аварийно завершать работу и выдает такую ​​ошибку.

Так что измените на это:

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

Без скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...